Matlab C/C++ 混合编程
Matlab调用C++程序,所用mexFunction定义函数:
void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]) { } // 参数说明如下: // 1)nlhs(number of left hand size parameters):返回给Matlab的返回值变量个数; // 2)plhs(pointer of left hand size parameters):函数返回参数的指针; // 3)nrhs(number of right hand size parameters):函数传入参数个数; // 4)prhs(pointer of right hand size parameters):函数传入参数的指针;const表示不能改变其指向的内容,此时涉及到强制类型转换,由double转换为int。 // 常用函数总结 // mxGetScalar(prhs[0]):把prhs[0]传递进来的mxArray类型的指针指向的数据(标量)赋值给C程序的变量。 // mxGetPr(prhs[0]):获取指向prhs[0]传进来的mxArray类型的double类型指针。 // 对于矩阵数据,需要使用mxGetM()和mxGetN()函数获取相关信息; // data=mxGetPr(prhs[0]); //获得指向矩阵的指针 // M=mxGetM(prhs[0]); //获得矩阵的行数 // N=mxGetN(prhs[0]); //获得矩阵的列数 // 注意:Matlab中的矩阵元素b(i,j)在传递到C中的一维数组data后对应的为data[j*M+i] // mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag):用来申请m行n列的double类型矩阵空间,用于函数返回值。 // mexErrMsgTxt(“Error”):给出错误提示并退出当前程序。 // mxIsDouble():判断mxArray中的数据类型是否是double类型
Matlab提供的API中,带mx-前缀多数是对mxArray数据进行操作的函数;而带mex-前缀则是与Matlab环境进行交互的函数。
Matlab中基本单元为array,包括double array,cell array,struct array…,而在C语言中,Matlab的array对应使用mxArray,而在C++语言中,对应的为mwArray。
mex函数是一种接口,它将C语言中的计算结果适当的返回给Matlab。当Matlab需要调用C语言编程的大型程序时,利用mex函数接口进行调用即可。Matlab与C/C++混合编程时,最好充分考虑到异常、错误等的处理。
Matlab调用C程序方法有两种:
1)mex文件实现:编写相关的mex函数,然后用mex编译即可。
2)Matlab调用C的dll。其调用dll的步骤:打开动态链接库文件;调用函数准备数据;调用动态链接库文件中导出的函数;关闭动态链接库文件
C/C++调用Matlab方法
调用Matlab计算引擎:混合编程后的可执行程序脱离不了Matlab的运行环境,运行速度很慢;
利用mcc编译器生成的cpp和hpp文件:虽然能独立与Matlab运行环境,可在C/C++环境中包含生成文件非常繁琐
利用mcc编译器生成个dll文件:可以简洁方便使C++/C调用Matlab程序。