我想将在 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]) 中, mxGetDatavoid* 返回到该缓冲区,您不能简单地将其转换为 double** 并期望获得有效指针数组。顺便说一句,我建议使用 static_cast 代替 C 样式转换。

关于c++ - 如何在 C++ mex 函数中传递 Matlab m x n 单元格矩阵参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19780754/

10-12 00:02
查看更多