写在前面
-
关于mex, mex类似于DLL,所以可以用C, C++等语言编写,同样的在MATLAB上也可以生成。
-
在MATLAB上编写MEX适用于那些已经完成了单步调试后的C函数模块,因为MATLAB无法对MEX的源文件也就是C函数进行调试,只会在编译的时候对一些语法错误进行检查,但是对于诸如数组越界之类的内存泄漏问题,MATLAB则无法进行检查。出现这类问题基本就是强退。因此,最好将C函数模块在VS下调试完成后再利用MATLAB进行后续结果分析,特别是涉及到一些数据处理,比如作图,拟合之类。
-
利用VS完成MEX的编写,需要进行一些配置,比如添加头文件,相关的依赖项等。
利用MATLAB编写MEX
1.编译环境设置,选择需要的C/C++编译器
mex -setup
2.编写MEX
#include "mex.h"
void mexFunction(
int nlhs,
mxArray *plhs[],
int nrhs,
const mxArray *prhs[]){
}
在mexFunction函数中,会涉及到输入数据的操作,利用mxGetPr得到数据的指针地址。mxGetM和mxGetN会返回矩阵的行和列(整数)。另外MATLAB的矩阵存储顺序是“从上到下,从左到右”。即A(i,j) = (M + m(j-1) +(i-1))
关于输出数据的操作,主要包括对输出数据分配内存空间,即
plhs[0]=mxCreateDoubleMatrix(m, n, mxREAL); //生成一个mxn的实矩阵
和输入数据一样,同样需要一个指向数据的指针变量
double *a;
A = mxGetPr(plhs[0];
下面给出了一个简单的例子,函数返回两个数的和。
#include "mex.h"
double testAdd(double x, double y){
return x + y;
}
void mexFunction(
int nlhs,
mxArray *plhs[],
int nrhs,
const mxArray *prhs[]){
double *a;
double b,c;
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
a = mxGetPr(plhs[0]);
b = *(mxGetPr(prhs[0]));
c = *(mxGetPr(prhs[1]));
*a = testAdd(b,c);
}
利用VS编写MEX
1.打开VS,新建项目,选择MFC DLL
2.配置项目属性
- C/C++ -> Additional Include Dirrctories 包含目录, 添加MATLAB安装目录下的\extern\include路径
- Linker -> General -> Additional Library Directories 库目录, 添加MATLAB安装路径下的\extern\lib\win64\microsoft
- Linker -> Input -> Additional Dependencies 附加依赖项,添加libmx.lib;libmex.lib;libmat.lib;
3.创建编辑输出函数
在源文件的路径下新建.def的文件,在文件内写入
EXPORTS mexFunction
在项目属性页的Linker->Input->Module Definition File内加入创建的***.def文件。
另外,更改Configuration Properties->General->Target Extension内容.mexw64
4.编写MEX文件
MEX文件编写要求与MATLAB内的一致。
5.VS编译MEX
编写完成后进行BUILD,没有错误在源码上一级的x64文件夹中的Debugw中会生成MATALB MEX类型的输出文件,可以在MATLAB环境下进行验证。
reference:
https://www.cnblogs.com/arxive/p/4687766.html
https://blog.csdn.net/bensnake/article/details/78832169