首页 文章

使用MATLAB中的MEX文件访问存储在单元阵列内的矩阵

提问于
浏览
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'”错误 .

2 回答

  • 4

    该代码示例中的许多问题:

    • 您在每一行都缺少尾随分号

    • mxArray 必须定义为指针:例如 mxArray *C_CELL .

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

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

    因此, C_CELL 必须定义为 mxArray **C_CELL . 请注意,在没有任何健全性检查或绑定检查的情况下执行此操作将很快导致段错误 . 使用mxGetCell作为@David Heffernan建议这是一种更安全,更可靠的方法(假设你已经检查过 prhs[0] 包含一个单元格数组) .

  • 6

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

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

相关问题