我想将在 Matlab 中创建的这样一个单元矩阵作为输入参数传递给 mex 函数,
for i=1:5,
p{i}=rand(3,4);
end
然后将其作为 3 维 double 数组作为输出参数返回。
预期语法:
Parray = convert(p);
其中 Parray 是一个 3×4×5 数值数组,P(:,:,i) = p{i};
我正在使用的以下代码可以成功构建到所需的 mex 函数中:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <matrix.h>
#include <cstring>
#include <string>
#include "mex.h"
using namespace std;
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[] )
{
if (nlhs>=1 && nrhs>=1){
int nsubs =2, index;
mwIndex subs[]={0, 0};
mxArray *tmp;
double **buf;
int cameraNum = mxGetNumberOfElements(prhs[0]);
mwIndex dims[]={cameraNum,3,4};
plhs[0] = mxCreateNumericArray(3,dims,mxDOUBLE_CLASS,mxREAL);
mexPrintf("there are %d cameras in the input cell.",cameraNum);
/* allocate memory for storing pointers */
buf = (double**)mxGetData(plhs[0]);
for (int i=0; i<cameraNum; i++){
subs8[1] = i;
// get the cell (i,1)
index = mxCalcSingleSubscript(prhs[1], nsubs, subs);
tmp = mxGetCell(prhs[0],index);
buf[i] = (double*)mxGetData(tmp);
int rownum = mxGetM(tmp);
int colnum = mxGetN(tmp);
mexPrintf("\n No. %d camera matrix is: \n",i);
for(int m=0;m<rownum;m++){
for(int n=0; n<colnum;n++){
mexPrintf("%lf\t",buf[i][m*colnum+n]);
}
}
}
mxFree(buf);
}
return;
}
但是,由于未知原因,它导致了Matlab的崩溃。
是什么原因?我怎样才能摆脱这个问题?
此外,如果所需的语法是:
Parray = convert(p);
和parray和p完全一样,如何在C++ mex函数中实现?
谢谢
最佳答案
在 plhs[0]
中,您创建了一个 3D mxArray,它有一个 double 缓冲区。因此,在 buf8 = (double**)mxGetData(plhs[0])
中, mxGetData
将 void*
返回到该缓冲区,您不能简单地将其转换为 double**
并期望获得有效指针数组。顺便说一句,我建议使用 static_cast
代替 C 样式转换。
关于c++ - 如何在 C++ mex 函数中传递 Matlab m x n 单元格矩阵参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19780754/