matlab调用C代码

    一般情况下,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

猜你喜欢

转载自blog.csdn.net/u013412738/article/details/19839601