2018-12-08 回答
基于dll形式vc调用matlab函数方法
如果在一matlab中或vc中写好了函数的话,想在对方的环境中使用,直接将对方语言的函数编译成dll是一个很方便的方法,不需要重写了。今天把基于dll形式vc调用matlab函数的主要过程写下,在后续将写一下matlab调用vc函数的方法。
1,matlab中编译dll
在matlab中写好函数,保存在mttestfun.m中,使用mcc -w cpplib:mtlibtestfun -t link:lib mttestfun.m生成dll,用这个命令生成的是c++形式的,即matlab数据类型可以用类;否则用其他的命令生成的c形式的,不能用类。并生成了相应的其他mtlibtestfun.h,mtlibtestfun.lib和mtlibtestfun.dll在内的一些文件
2,vc中引用matlab环境
需要引用的.h文件路径为matlab安装目录的extern\include,需要引用的.lib文件路径为matlab安装目录的extern\lib\win32\microsoft;引入附加库mclmcrrt.lib
3,vc中调用matlab函数
将刚才matlab编译生成的文件全拷到当前vc工程下,只将mtlibtestfun.h文件加入到当前工程,并在需要调用的文件中包含;引入附加库mtlibtestfun.lib。在vc初始化函数里用下面函数进行初始化
mclinitializeapplication(null,0);
mtlibtestfuninitialize();
在结束时用下面函数释放
mtlibtestfunterminate();
mclterminateapplication();
下面在需要的地方调用,假设是下面的形式
mtlibtestfun(int nargout, mwarray& y, const mwarray& i, const mwarray& th);
nargout是返回参数个数,这里是1,后面y反演向量则是传出参数,i和th则是传入参数辐射值和切高。
c++数据传入matlab函数时需要将其转化成mwarray类型
double* pi = new double[row*column];
pl = ...
mwarray mwi(row, column, mxdouble_class);
mwi.setdata(pi, row*column);
返回后还需要将mwarray转回c++类型数据
double* py = new double[yrow*ycolumn];
mwy.getdata(py, yrow*ycolumn);
当然,对于一维数组数据来说,这样调用是没有问题的,但是对于二维矩阵数据来说,上面的调用会发生数据传入和传出错误。因为c++与matlab数组存储顺序不一样,matlab是列优先与c++中的行优先不同。这个数据的转换也将在后续给出一些解决办法。