>> mbuild -setup C++
MBUILD configured to use 'Microsoft Visual C++ 2017' for C++ language compilation.
mbuild -setup
>> deploytool
,出现下图结果:for_redistribution目录下是MyAppInstaller_web.exe,这个是MATLAB运行时库的和本项目的安装文件,运行后可从网上下载MATLAB的运行时库进行安装,还会安装本项目生成的dll、lib和h文件。
for_redistribution_files_only目录下是编译生成的.dll 、.lib和.h文件,其中.lib和.h文件是在Qt项目编译时需要用到的,.dll文件是程序运行时需要用到的。
for_testing 目录下是用于测试的。
该段引自:https://blog.csdn.net/HongAndYi/article/details/79433623
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/include/ -lpso
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/include/ -lpso
else:unix: LIBS += -L$$PWD/include/ -lpso
INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include
INCLUDEPATH += $$quote(C:/Program Files/MATLAB/R2018b/extern/include)
INCLUDEPATH += $$quote(C:/Program Files/MATLAB/R2018b/extern/include/win64)
INCLUDEPATH += $$quote(C:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft)
DEPENDPATH += $$quote(C:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft)
LIBS += -L$$quote(C:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft/) -llibmex
LIBS += -L$$quote(C:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft/) -llibmx
LIBS += -L$$quote(C:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft/) -llibmat
LIBS += -L$$quote(C:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft/) -llibeng
LIBS += -L$$quote(C:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft/) -lmclmcr
LIBS += -L$$quote(C:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft/) -lmclmcrrt
#include "pso.h"
//下面是调用MatLab编译好的粒子群算法
QLibrary myLib("pso.dll");
typedef bool MW_CALL_CONV(*Fun)(int,class mwArray const &,class mwArray const &,class mwArray const &,class mwArray const &,class mwArray const &,class mwArray const &);
Fun myFunc = Fun(myLib.resolve("?PSO@@YAXHAEAVmwArray@@000AEBV1@1@Z"));
if(!psoInitialize()) //必须要初始化成功
{
qDebug()<<"could not initialize psodll\n";
exit(0);
}
mwArray coor(str.size(),4,mxDOUBLE_CLASS); //输入值
mwArray v(1,1,mxDOUBLE_CLASS);
mwArray x(1,1,mxDOUBLE_CLASS); //输出值
mwArray y(1,1,mxDOUBLE_CLASS);
mwArray z(1,1,mxDOUBLE_CLASS);
mwArray t(1,1,mxDOUBLE_CLASS);
coor.SetData(adjustToArray,4*str.size());
v(1,1)=WAVEVELOCITY;
myFunc(4,x,y,z,t,coor,v);
XRESULT=x.ToString();
YRESULT=y.ToString();
ZRESULT=z.ToString();
TRESULT=t.ToString();
需要说明的是由于matlab使用vs的msvc编译器生成的dll文件,生成后我们使用mingW调用,但生成的头文件中指定各种编译器对应的情况,但唯独没有MinGW,这就导致了在使用MinGW编译器时我们在.pro文件中添加:
DEFINES += MW_STDINT_H
使用msvc编译器调用matlab生成的dll时,编译器会自动识别函数名,因此也不需要使用resolve函数。
这段话引自:https://blog.csdn.net/China_Rocky/article/details/104592488
Fun myFunc = Fun(myLib.resolve("?PSO@@YAXHAEAVmwArray@@000AEBV1@1@Z"));
extern LIB_pso_CPP_API void MW_CALL_CONV PSO(int nargout, mwArray& x, mwArray& y, mwArray& z, mwArray& t, const mwArray& sample, const mwArray& v);
(1)DLL的初始化
在使用pso.dll里的函数之前,必须先初始化。psoInitialize()是matAdd.h文件里面的库初始化函数。
(2)PSO函数的输入输出参数
mwArray是MATLAB的数组类,MATLAB编译生成的DLL的接口函数的参数都是采用mwArray类型,例如:extern LIB_pso_CPP_API void MW_CALL_CONV PSO(int nargout, mwArray& x, mwArray& y, mwArray& z, mwArray& t, const mwArray& sample, const mwArray& v);
int nargout 是输出参数个数,比如我这里是4,那么,后面x,y,z,t变量是输出参数,
mwArray &sample, const mwArray &v是输入参数
(3)mwArray类的使用
mwArray coor(str.size(),4,mxDOUBLE_CLASS);
定义mwArray类型的变量coor时,利用构造函数传递了数组的行数、列数、元素类型、实数或复数类型语句
coor.SetData(adjustToArray,4*str.size()); 将一维向量adjustToArray的数据内容赋值给coor,元素个数为4*str.size(),等于行数*列数。使用SetData赋值时,输入adjustToArray必须是一个向量,是逐列存储的。
注意:mwArray数组的下标都是从1开始的,与C/C++的数组元素下标从0开始不同。
这段话修改自:https://blog.csdn.net/HongAndYi/article/details/79433623
一.矩阵赋值
<1>mwArray 定义矩阵变量
mwArray A(rows, cols, type)
参数说明:
A :变量名
rows:行数
col :列数
type:数t据类型
type类型有:
typedef enum
{
mxUNKNOWN_CLASS = 0, //未知类型
mxCELL_CLASS, //细胞类型
mxSTRUCT_CLASS, //结构类型
mxLOGICAL_CLASS, //布尔类型
mxCHAR_CLASS, //字符串类型
mxVOID_CLASS, //void类型
mxDOUBLE_CLASS,
mxSINGLE_CLASS, //单精度浮点数
mxINT8_CLASS, //
mxUINT8_CLASS,
mxINT16_CLASS,
mxUINT16_CLASS,
mxINT32_CLASS,
mxUINT32_CLASS,
mxINT64_CLASS,
mxUINT64_CLASS,
mxFUNCTION_CLASS, //函数类型
mxOPAQUE_CLASS, //
mxOBJECT_CLASS //对象类型
}
整体含义是:定义矩阵A,行数为:rows,列数为:cols,类型为:type
注: 如果参数不是矩阵,只是一个数,令 rows=1,cols=1即可。
<2>矩阵赋初值:
int a[6] = {
1,2,3,4,5,6}
mwArray A(2,3,mxINT32_CLASS);
A.SetData(a,6); //第二个参数为要设置的数的个数,大小可设为rows*cols
注:该过程相当于把1*6的矩阵,转化为2*3的矩阵,matlab转化顺序是,先排第一列,由上到下为a[0] a[1],然后排第二列,由上到下为a[2] a[3],即转化后的A为:
1 3 5
2 4 6
如果要使A为:
1 2 3
4 5 6
需这样赋值:
<pre name="code" class="cpp">int a[6] = {
1,2,3,4,5,6}
mwArray A(3,2,mxINT32_CLASS); //修改此处:行列数互换
A.SetData(a,6); //第二个参数为要设置的数的个数,大小可设为rows*cols
此时生成的A为:
1 4
2 5
3 6
该矩阵转置之后,既可以达到所需形式,转置过程可以在matlab的.m文件中添加,先修改.m,然后在生成dll、lib、h文件。
尤其是,在图像处理时,如果传递的矩阵为图像数据矩阵,要采用后一种方法赋值,否则,图像会严重变形失真。
二、字符串赋值
char str[5] = "abcd";
//或 CString str = "abcd"
mwArray mwA(str);
该段转载自:https://blog.csdn.net/hong__fang/article/details/43307701
仅用于学习使用