关于Matlab调用C函数的问题

在进行算法验证的时候,Matlab无疑是一把利器,如果将用C写的代码, 在用Matlab实现一遍,确实很浪费时间。当对于Matlab不是特别熟悉的时候, 尤其麻烦。
关于Matlab调用C的方式,已经固定了,介绍也很多。
但是有一个地方,还没有见到有很多介绍。
如何在C中方便地使用Matlab传递过来的变量?
 
由于Matlab中常使用double型变量,而C中最常使用的是int型变量,当使用mexFunction函数将变量以mxArray格式传递到C文件中的时候, 如果在C文件中使用的不是double型,都要 要进行数据转换。double型的计算精度要高于int型及其他类型,如果使用double型进行计算,可能结果会优于实际情况。如果强行使用指针进行转换,因为double型和int型占用的内存空间不一样,势必会出现问题。
 
想了一些方法后,发现最简单的是,开辟一个元素个数相同的数组或者矩阵。将prhs中的元素都进行强制类型转换,复制到新的数组或者矩阵中,然后对于这个新的数组或者矩阵进行操作。
 
在返回时,将开辟的数组或者矩阵中的元素再进行强制转换,复制到plhs中。回到Matlab的double类型。
 
当然这样做一个不好的地方就是,占用了不少内存。
 
注:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
     uint32_t i;
     uint32_t count;
     uint32_t m;
     uint32_t n;
     double   *in;
     double   *out;
     uint32_t *handle;

     if(prhs == NULL)
          return;

     in = (double*)mxGetPr(prhs[0]);
     m = mxGetM(prhs[0]);
     n = mxGetN(prhs[0]);
     plhs[0] = (double*)mxCreateDoubleMatrix(m, n, mxREAL);
     out = (double*)mxGetPr(plhs[0]);

     handle = (uint32_t *)malloc(m*n*sizeof(uint32_t ));
     count = m* n;
     mexPrintf("the count:%d\n", count);

     for(i = 0; i < count; i++)
     {
          handle[i] = (uint32_t)in[i];
//          mexPrintf("the data: %u, d: %lf\n", handle[i], in[i]);
     }

     for(i = 0; i < count; i++)
     {
          DataProcess(&handle[i]);    
     }

     for(i = 0; i < count; i++)
     {
          out[i] = (double)handle[i];
          mexPrintf("the i: %d the data: %u, d: %lf\n", i, handle[i], out[i]);
     }    
     nlhs = count;
     mexPrintf("the nlhs: %d\n", nlhs);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值