我目前正在编写一个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'”错误。
答案 0 :(得分:6)
您需要使用mxGetCell
来提取单元格数组的内容。
mxArray *cellArray[2];
cellArray[0] = mxGetCell(prhs[0], 0);
cellArray[1] = mxGetCell(prhs[0], 1);
答案 1 :(得分:4)
该代码示例中的许多问题:
mxArray
必须定义为指针:例如mxArray *C_CELL
。但根据您收到的错误消息,我认为您在使用的来源中有正确的项目。
您的主要问题是您将mxGetData
的输出分配给mxArray *
。 mxGetData
的工作方式是返回指向矩阵内容的原始(void *
)指针。在这种情况下,您的矩阵包含一个mxArray
指针数组,具有两个指针重定向级别。
因此,C_CELL
必须定义为mxArray **C_CELL
。请注意,在没有任何健全性检查或绑定检查的情况下执行此操作将很快导致段错误。使用mxGetCell
作为@David Heffernan建议这是一种更安全,更可靠的方法(假设您已经检查过prhs[0]
包含一个单元格数组。)