在 MATLAB 中使用 MEX 文件访问存储在元胞数组中的矩阵

Posted

技术标签:

【中文标题】在 MATLAB 中使用 MEX 文件访问存储在元胞数组中的矩阵【英文标题】:Accessing matrices stored inside of cell arrays using MEX files in MATLAB 【发布时间】:2012-04-16 18:08:11 【问题描述】:

我目前正在编写一个 MEX 函数,该函数必须与 MATLAB 中的元胞数组一起使用。 MEX 文件是用 C 语言编写的。

本质上,我的函数的输入将是一个元胞数组,其中每个条目都是一个具有实数值的数值矩阵。一个简单的例子是:

C = cell(1,2);
C1 = ones(10,10);
C2 = zeros(10,4);

我希望能够访问我的 MEX 文件中的数值数组 C1 和 C2。理想情况下,我希望这样做,而不必在我的 MEX 文件中创建数据的第二个副本(即获取它们的指针)。

使用前面的例子,我目前的做法如下:

/* declare a pointer variable to the incoming cell array after it is passed to the MEX function */
mxArray C_CELL = (mxArray *) mxGetData(prhs[0]) 

/* declare  a 2 x 1 array of pointers to access the cell array in C */
double *myarray[2] //

/* point towards the contents of C_CELL */
myarray[0] = mxGetPr(C_CELL[0])
myarray[1] = mxGetPr(C_CELL[1])

不幸的是,这似乎会产生“无效使用未定义类型'struct mxArray_tag'”错误。

【问题讨论】:

'无效使用未定义类型'通常意味着缺少头文件,您甚至没有显示您的包含。 【参考方案1】:

您需要使用mxGetCell 来提取元胞数组的内容。

mxArray *cellArray[2];
cellArray[0] = mxGetCell(prhs[0], 0);
cellArray[1] = mxGetCell(prhs[0], 1);

【讨论】:

【参考方案2】:

该代码示例中有很多问题:

每行都缺少尾随分号 mxArrays 必须定义为指针:例如,mxArray *C_CELL

但根据您收到的错误消息,我想您在使用的源中具有正确的这些项目。

您的主要问题是将mxGetData 的输出分配给mxArray *mxGetData 的工作方式是它返回一个指向矩阵内容的原始 (void *) 指针。在这种情况下,您的矩阵包含mxArray 指针数组,具有两级指针重定向。

因此,C_CELL 必须定义为 mxArray **C_CELL。请注意,在没有任何完整性检查或绑定检查的情况下执行此操作将迅速导致段错误。正如@David Heffernan 所建议的那样使用mxGetCell 是一种更安全、更可靠的方法(假设您已检查您的prhs[0] 是否包含一个元胞数组)。

【讨论】:

以上是关于在 MATLAB 中使用 MEX 文件访问存储在元胞数组中的矩阵的主要内容,如果未能解决你的问题,请参考以下文章

操作存储在元胞数组中的矩阵——Matlab

mex 文件崩溃,如何在 matlab 中使用 MATLAB_MEM_MGR?

在 Matlab 中使用 OpenCV:mex 找不到头文件

为啥这段代码(在 Matlab 的 MEX 文件中使用 OpenMP)给出不同的结果?

防止 MEX 文件在 MATLAB 中崩溃

用C读取matlab的mat文件