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