我已经将图像传递给了我的mexFunction,但现在我需要传递一系列图像,我正在努力使事情正确。这是我获取简单图像的代码。这很有效,但当我进入3D时,我不明白信息在mxArray中的排列方式。
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
{
mxArray *matrixIn = prhs[0];
inputImage=(double *)mxGetPr(matrixIn);
int x = int(dims[0]);
int y = int(dims[1]);
volume3D image(inputImage, x, y, 1);
}
volume3D::volume3D(double* image, int x, int y, int z)
{
allocateVolume( x, y, z);
for(int i=0; i<xSize; i++)
for(int j=0; j<ySize; j++) {
volume[i][j][0] = double(image[(i)*x+j]);
}
}
我做了类似的事情以反过来传递
mwSize mrows,ncols; mrows = mxGetM(prhs [0]); ncols = mxGetN(prhs [0]);
plhs[0] = mxCreateNumericMatrix(mrows, ncols, mxDOUBLE_CLASS, mxREAL);
double *matlabTumorMap = mxGetPr(plhs[0]);
const int * dims = mxGetDimensions( plhs[0]);
int x = int(dims[0]);
int y = int(dims[1]);
int z = int(dims[2]);
mwIndex subs[3];
mexPrintf("x %i\n",x);
mexPrintf("y %i\n",y);
mexPrintf("z %i\n",z);
mxArray *matrixTumor = plhs[0];
for(subs[0]=0; subs[0]<x; subs[0]++)
for(subs[1]=0; subs[1]<y; subs[1]++)
for(subs[2]=0; subs[2]<z; subs[2]++)
{
mwIndex x = mxCalcSingleSubscript( matrixTumor,3,subs);
matlabTumorMap[x] = tumorMap.getVoxel(subs[0],subs[1],subs[2]);
}
答案 0 :(得分:1)
根据http://www.mathworks.de/help/techdoc/apiref/bqoqnz0.html,有mxCalcSingleSubscript
可帮助您计算这些数据。
像
这样的东西 mxArray *matrixIn = prhs[0];
volume3D image(matrixIn);
}
volume3D::volume3D(MxArray* matrixIn)
{
double * inputImage=(double *)mxGetPr(matrixIn);
assert(mxGetNumberOfDimensions(matrixIn) >= 3)
mwSize * dims = mxGetDimensions(matrixIn);
int x = int(dims[0]);
int y = int(dims[1]);
int z = int(dims[2]);
double * image = mxGetPr(matrixIn);
mwIndex subs[3];
allocateVolume( x, y, z);
for(subs[0]=0; subs[0]<x; subs[0]++)
for(subs[1]=0; subs[1]<y; subs[1]++)
for(subs[2]=0; subs[2]<z; subs[2]++) {
mwIndex x = mxCalcSingleSubscript(matrixIn, 3, subs);
/* <unsure> */volume[subs[0]][subs[1]][subs[2]] /* </unsure> */ = image[x];
}
BTW:如果混合使用C和C ++,请注意 - 由于名称损坏等原因,它会导致更多的麻烦。
答案 1 :(得分:0)
你正在做正确的事。
唯一的问题是你的索引,我想。你应该写:
volume[i][j][0] = double(image[i+j*x]);
你忘记写了:
mwSize* dims = mxGetDimensions(matrixIn);