我想将在Matlab中创建的这样的单元矩阵作为输入参数传递给mex函数,
for i=1:5,
p{i}=rand(3,4);
end
然后将其作为3维双数组作为输出参数返回 . 预期语法:
Parray = convert(p);
其中Parray是一个3乘4乘5的数值数组而P(:,:,i)= p ;
我正在使用的以下代码可以成功构建到所需的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完全一样,如何在C mex函数中实现?
谢谢
3 回答
在
plhs[0]
中,您创建了一个3D mxArray,它有一个双精度缓冲区 . 所以在buf8 = (double**)mxGetData(plhs[0])
中,mxGetData
将void*
返回到该缓冲区,您不能简单地将其转换为double**
并期望得到一组有效指针 . 顺便说一句,我建议使用static_cast
代替C风格的演员 .我终于通过一个评论的例子来实现它 . 我在这里发布了示例实现代码,以供任何感兴趣的其他人参考 .
我用它在结构中创建一个矩阵字段:一个选项是创建一个临时变量,然后将它的值赋给结构的一个字段: