matlab调用C代码

本文介绍了一种解决MATLAB算法移植到C时遇到的问题的方法,即通过mex工具将C代码编译为MATLAB可调用的形式,帮助定位转换过程中的错误。文章提供了具体的示例代码,并展示了如何在MATLAB环境中调用C函数。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值