如何在matlab中将double图像数组传递给mexFunction

时间:2011-11-22 18:01:46

标签: matlab

我已经将图像传递给了我的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]);
        }

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);