如何将结构从 Matlab 代码转换为 C 代码(使用 Matlab 编译器)
How to Convert a structure from Matlab code to C code (using Matlab Compiler)
我一直在尝试使用 Matlab 编译器创建一个 C 共享库,一段时间以来它将用作不同应用程序的插件库。我最近以为我完成了这项任务只是为了意识到我从我新的 "Matlab Compiled" 共享库调用的函数需要将其 return 转换为 C 结构。
我使用在 Matlab Answers 网站上找到的示例来帮助我创建包装器 level2 函数来调用我的 Matlab 函数,它需要 return 一个结构。(http://www.mathworks.com/matlabcentral/answers/94715-how-do-i-wrap-matlab-compiler-4-8-r2008a-created-c-dlls-to-create-another-dll)
我的问题出在下面代码的 Convert returned MATLAB data to C data 部分。我可以很好地转换为整数、双精度数、字符数等,但我无法弄清楚如何编写从 mxArray return 由 matlab 编辑到 C 结构的转换代码。
/* Wrapper for level 1 function exported by the MATLAB generated DLL *
* This function converts C data to MATLAB data, calls the MATLAB generated *
* function in level1.dll and then converts the MATLAB data back into C data */
int wmlfLevel1(double* input2D, int size, char* message, double** output2d){
int nargout=1;
/* Pointers to MATLAB data */
mxArray *msg;
mxArray *in2d;
mxArray *out2d=NULL;
/* Start MCR, load library if not done already */
int returnval=isMCRrunning();
if(!returnval)
return returnval;
/* Convert C data to MATLAB data */
/* IMPORTANT: this has to be done after ensuring that the MCR is running */
msg=mxCreateString(message);
in2d=mxCreateDoubleMatrix(size, size, mxREAL);
memcpy(mxGetPr(in2d), input2D, size*size*sizeof(double));
/* Call the M function */
returnval=mlfLevel1(nargout, &out2d, in2d, msg);
/*Convert returned MATLAB data to C data */
*output2d=(double *)malloc(sizeof(double)*size*size);
memcpy(*output2d, mxGetPr(out2d), size*size*sizeof(double));
/* Clean up MATLAB variables */
mxDestroyArray(msg);
mxDestroyArray(in2d);
mxDestroyArray(out2d);
return returnval;
}
到目前为止,我已经尝试使用 mxCreateStructMatrix 函数,我尝试创建一个 C 结构骨架,我即将尝试 libstruct 函数,但由于我是 C 编程和 Matlab 编译器的新手,任何帮助将不胜感激!
mxGetPr
只是返回指向双精度缓冲区的指针。 malloc
调用分配了足够的 space 来存储 size^2 双精度值。 memcpy
正在将数据从 out2d 的内部存储复制到您的缓冲区中。
缓冲区是一维的,因此您必须根据行和列计算索引。您可以使用 output2d[col * size + row]
之类的东西来访问特定值。 (这可能会被调换 - 我现在无法访问文档。)
当您完全完成 output2d
后,您需要调用 free(output2d)
来释放内存,否则您的代码将发生内存泄漏。
我一直在尝试使用 Matlab 编译器创建一个 C 共享库,一段时间以来它将用作不同应用程序的插件库。我最近以为我完成了这项任务只是为了意识到我从我新的 "Matlab Compiled" 共享库调用的函数需要将其 return 转换为 C 结构。
我使用在 Matlab Answers 网站上找到的示例来帮助我创建包装器 level2 函数来调用我的 Matlab 函数,它需要 return 一个结构。(http://www.mathworks.com/matlabcentral/answers/94715-how-do-i-wrap-matlab-compiler-4-8-r2008a-created-c-dlls-to-create-another-dll)
我的问题出在下面代码的 Convert returned MATLAB data to C data 部分。我可以很好地转换为整数、双精度数、字符数等,但我无法弄清楚如何编写从 mxArray return 由 matlab 编辑到 C 结构的转换代码。
/* Wrapper for level 1 function exported by the MATLAB generated DLL *
* This function converts C data to MATLAB data, calls the MATLAB generated *
* function in level1.dll and then converts the MATLAB data back into C data */
int wmlfLevel1(double* input2D, int size, char* message, double** output2d){
int nargout=1;
/* Pointers to MATLAB data */
mxArray *msg;
mxArray *in2d;
mxArray *out2d=NULL;
/* Start MCR, load library if not done already */
int returnval=isMCRrunning();
if(!returnval)
return returnval;
/* Convert C data to MATLAB data */
/* IMPORTANT: this has to be done after ensuring that the MCR is running */
msg=mxCreateString(message);
in2d=mxCreateDoubleMatrix(size, size, mxREAL);
memcpy(mxGetPr(in2d), input2D, size*size*sizeof(double));
/* Call the M function */
returnval=mlfLevel1(nargout, &out2d, in2d, msg);
/*Convert returned MATLAB data to C data */
*output2d=(double *)malloc(sizeof(double)*size*size);
memcpy(*output2d, mxGetPr(out2d), size*size*sizeof(double));
/* Clean up MATLAB variables */
mxDestroyArray(msg);
mxDestroyArray(in2d);
mxDestroyArray(out2d);
return returnval;
}
到目前为止,我已经尝试使用 mxCreateStructMatrix 函数,我尝试创建一个 C 结构骨架,我即将尝试 libstruct 函数,但由于我是 C 编程和 Matlab 编译器的新手,任何帮助将不胜感激!
mxGetPr
只是返回指向双精度缓冲区的指针。 malloc
调用分配了足够的 space 来存储 size^2 双精度值。 memcpy
正在将数据从 out2d 的内部存储复制到您的缓冲区中。
缓冲区是一维的,因此您必须根据行和列计算索引。您可以使用 output2d[col * size + row]
之类的东西来访问特定值。 (这可能会被调换 - 我现在无法访问文档。)
当您完全完成 output2d
后,您需要调用 free(output2d)
来释放内存,否则您的代码将发生内存泄漏。