一般情况下,matlab中的一般关键计算分支,占开销比较大的,才会用C/C++进行重写优化,以提升算法性能。不过当前的使用不太一样:
算法原型是用MATLAB开发的,在转浮点C代码时,出现一些问题,定位时比较困难,只能两边打印变量。
想到一个办法就是:将C中的关键模块使用mex编译后,使用matlab调用,通过替换排查的方法,定位问题模块。有一个限制就是:Matlab与C的模块结构
一致,尽量通过传参实现,少用struct,因为MATLAB与C之间传递struct时转换比较麻烦。
下面介绍一下mex的示例:
#include "mex.h"
void arrayAdd(double *a, double *b, double *c, int len)
{
int i;
for (i = 0; i < len; i++)
{
c[i] = a[i] + b[i];
}
}
//Matlab调用:c = arrayAdd(a,b);
void mexFunction(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[])
{
double *a, *b, *c;
int asize, bsize;
//参数数目校验
if (nlhs != 1)
{
mexErrMsgTxt("输出参数数目不对");
}
if (nrhs != 2)
{
mexErrMsgTxt("输入参数数目不对");
}
//数据类型验证
if (mxIsClass(prhs[0], "double"))
{
a = mxGetPr(prhs[0]);
}
else
{
mexErrMsgTxt("prhs[0]不是double类型");
}
if (mxIsClass(prhs[1], "double"))
{
b = mxGetPr(prhs[1]);
}
else
{
mexErrMsgTxt("prhs[1]不是double类型");
}
asize = mxGetM(prhs[0]);
bsize = mxGetM(prhs[1]);
if (asize == 1)
{
asize = mxGetN(prhs[0]);
bsize = mxGetN(prhs[1]);
}
if (asize != bsize)
{
mexErrMsgTxt("prhs[0]与prhs[1]维数不一致");
}
//创建Double数组
plhs[0] = mxCreateDoubleMatrix(asize, 1, mxREAL);
c = mxGetPr(plhs[0]);
arrayAdd(a,b,c,asize);
}
将上述代码保存到arrayAdd.c中,调用mex arrayAdd.c,编译得到arrayAdd.mexw32文件。
>>a = rand(10,1); b = rand(10,1);
>>c = arrayAdd(a,b)
结果如下:
c =
0.9723
1.8764
1.0842
1.3988
1.4326
0.2394
0.7003
1.4626
1.7497
1.9244