Как передать массив двойных изображений в mexFunction в matlab - PullRequest
0 голосов
/ 22 ноября 2011

Я уже передал изображение в свою функцию 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 ]

1 голос
/ 22 ноября 2011

Согласно 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];
            }

Кстати: обратите внимание, если смешивать C и C ++ - это может привести к еще большей головной боли из-за искажения имени и т. Д.

0 голосов
/ 22 ноября 2011

Вы все делаете правильно.

Думаю, единственная проблема - это ваша индексация.Вы должны написать:

 volume[i][j][0] = double(image[i+j*x]);

, а также вы забыли написать:

mwSize* dims = mxGetDimensions(matrixIn);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...