gpt4 book ai didi

c++ - 如何在 C++ mex 函数中传递 Matlab m x n 单元格矩阵参数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:19 25 4
gpt4 key购买 nike

我想将在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com