在进行算法验证的时候,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);
{
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 ));
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);
}
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);
}