3

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

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

C = cell(1,2);
C{1} = ones(10,10);
C{2} = zeros(10,4);

我希望能够访问我的 MEX 文件中的数值数组 C{1} 和 C{2}。理想情况下,我想这样做,而不必在我的 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'”错误。

4

2 回答 2

6

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

mxArray *cellArray[2];
cellArray[0] = mxGetCell(prhs[0], 0);
cellArray[1] = mxGetCell(prhs[0], 1);
于 2012-04-16T18:41:27.853 回答
4

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

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

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

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

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

于 2012-04-16T18:49:13.417 回答