原创 关于Matlab调用C函数的问题。

2013-6-20 18:43 3020 25 5 分类: 消费电子

 

在进行算法验证的时候,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 = (uint32_t)in;
//          mexPrintf("the data: %u, d: %lf\n", handle, in);
     }

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

     for(i = 0; i < count; i++)
     {
          out = (double)handle;
          mexPrintf("the i: %d the data: %u, d: %lf\n", i, handle, out);
     }    
     nlhs = count;
     mexPrintf("the nlhs: %d\n", nlhs);
}

文章评论3条评论)

登录后参与讨论

1989tie_959541171 2013-7-13 21:27

前几天试了下,在Matlab中确实有直接转换的函数,从double转uint32,可以直接使用uint32(),对于向量也是支持的。这个谢谢提示呵。 不过在返回时发现没有mxCreateIntMatrix()函数,编译时报错,这样返回值出现问题。难道只有mxCreateDoubleMatrix函数?

1989tie_959541171 2013-7-5 09:38

谢谢提醒,对于Matlab用的并不是很多,所以对于里边的一些用法还不熟悉。对于你提到的,这几天在google上找到了转换函数,但是还没有测试代码。\n 在查找的过程中,发现很多博客和帖子都没有提到关于类型转换的问题,对于类型的转换在算法的性能上不重要吗?\n 还是,因为更多的都是在计算机上跑的,对于类型不用考虑那么多。但是,double类型的运算速度明显要比int型慢,计算精度比int型高很多,尤其是在验证处理大量数据时候,这些可能会导致仿真,和实际的算法性能差很多。为什么,很多博客没有提到Matlab和C混编的时候,类型转换的问题呢?

用户1679378 2013-6-28 08:25

闲大了……直接在计算的时候把初始的double值转成一个int型的中间变量不就得了。用到哪些转哪些。你这样搞又费时间又费内存。 如果你非要成片地用数据,可以让MATLAB直接给你传int型矩阵。你在MATLAB里面把一个double矩阵转换成int型不比你自己用C搞方便多了(MATLAB自己的库函数肯定还就计算机架构做过优化)。
相关推荐阅读
catch2000 2015-07-19 11:44
信号线小电阻的作用
在一块新的PCB上,测试系统能否正常运行的时候,发现系统上电后没有正常启动。  系统框图如下:   在上电的时刻,CPU A(GPIO电平2.6V)会向串口发送启动日志数据,CPU A启动后,...
catch2000 2015-07-05 17:04
协议设计中ACK机制的影响
在TCP/IP中,延时ACK和Nagle算法。  TCP为了同时处理成块数据(通常为512字节的用户数据)和交互数据(通常用户数据比较少,例如不大于10个字节),采用了延时ACK和Nagle算法...
catch2000 2015-05-23 15:48
话说物联网操作系统
最近好多家都宣布推出自己的物联网操作系统。   1. Google将要在Google I/O大会发布的Brillo; 2. 三星推出的Artik芯片搭载Mentor Graphics的...
catch2000 2015-03-31 23:52
不要采用异或来交换两个变量
在进行两个变量的时候,经常会看到有些书误人子弟的推荐使用异或的方式: 方式一 {   x = x ^ y;   y = x ^ y;   x = x ^ y; } 而不是...
catch2000 2014-10-09 07:28
为什么要测试先行
在产品的研发过程中,测试一项至关重要。不论是软件还是硬件。   软件的测试先行,在研发过程中,就做到质量的保证,因为在出现Bug的时候,容易定位Bug,而且即使是在客户端出现Bug,也能够...
catch2000 2014-10-09 07:26
C语言的面向对象编程(一)
一、前言 对于编程而言,重要的是解决问题的方式,而不是语言本身。面向对象与面向过程是解决问题和思考问题的方式。C语言常说是面向过程开发的语言,因为其缺少很多对于面向对象特性的支持。但,这并不影...
我要评论
3
25
关闭 站长推荐上一条 /2 下一条