如何使用Matlab mex输出2D整数数组?

时间:2014-02-14 11:00:17

标签: c++ arrays matlab mex

我得到了关于Matlab mex函数输入/输出2D数组格式的后续问题。例如,我有一个变量'outputBuff'被定义为C ++ 2D整数数组。在处理之后,我想将其输出为'plhs'(左手边的参数)。不知道怎么做。

int** outputBuff;

size_t col_outputBuff       = mxGetN(prhs[4]);
size_t row_outputBuff       = mxGetM(prhs[4]);

// Allocate the memory for 2D array
outputBuff                  = (int **)mxCalloc(col_outputBuff, sizeof(int*));

for(int x = 0; x < col_outputBuff; x++) {
    outputBuff[x] = (int *) mxCalloc(row_outputBuff, sizeof(int));
}

// Read in the data
for (int col=0; col < col_outputBuff; col++) {
    for (int row=0; row < row_outputBuff; row++) {
        outputBuff[col][row] = ((int *)mxGetPr(prhs[4]))[row+col*row_outputBuff];
    }
}

然后将其输出为plhs

const mwSize dims[]         = {col_outputBuff, row_outputBuff};
plhs[0]                     = mxCreateNumericArray(2, dims, mxINT32_CLASS, mxREAL);

mxArray *outputMatrix;
outputMatrix                = mxCreateNumericMatrix(col_outputBuff, row_outputBuff, mxINT32_CLASS, mxREAL);
outputBuff[0]               = (int *)mxGetPr(outputMatrix);
outputMatrix                = (mxArray *)mxGetData(plhs[0]);

可以编译代码,但不是按预期输出全零。你能给我一些提示吗?非常感谢。 A.

编辑1:

彼得,嗨,谢谢你的回复。我确实需要保持C风格的2D矩阵(或2D数组),因为我将inputBuffer定义为int **。另外,我已经为inputBuffer做了一些处理,为了简化问题,我没有粘贴处理inputBuffer的代码。

下面的内容无效:

int** inputBuffer;

// Codes to processing inputBuffer ... ...
// inputBuffer need to be C-Style 2D array

plhs[0]                     = mxCreateNumericMatrix(col_outputBuff, row_outputBuff, mxINT32_CLASS, mxREAL);
int** outputBuffer          = (int**)mxGetData(plhs[0]);

    for (int col=0; col < col_outputBuff; col++) {
        for (int row=0; row < row_outputBuff; row++) {
            outputBuffer[col][row]    = inputBuffer[col][row];
        }
    }

有什么想法吗?

编辑2:

我再次尝试了你的提示:

int** outputBuff;

size_t col_outputBuff       = mxGetN(prhs[4]);
size_t row_outputBuff       = mxGetM(prhs[4]);

// Allocate the memory for 2D array
outputBuff                  = (int **)mxCalloc(col_outputBuff, sizeof(int*));

for(int x = 0; x < col_outputBuff; x++) {
    outputBuff[x] = (int *) mxCalloc(row_outputBuff, sizeof(int));
}

// Read in the data
for (int col=0; col < col_outputBuff; col++) {
    for (int row=0; row < row_outputBuff; row++) {
        outputBuff[col][row] = ((int *)mxGetPr(prhs[4]))[row+col*row_outputBuff];
    }
}

// Process the data save in outputBuff ...

// Create the output array, including memory buffers
plhs[0] = mxCreateNumericMatrix(col_outputBuff, row_outputBuff, mxINT32_CLASS, mxREAL);

// Get the pointer to the memory where you should store the data
int* outputMatrix = (int*)mxGetData(plhs[0]);

for (int col=0; col < col_outputBuff; col++) {
    for (int row=0; row < row_outputBuff; row++) {
        outputMatrix[row + col*row_outputBuff] = outputBuffer[row + col*row_outputBuff];
    }
}

但是,存在“无法将int *转换为int **”的编译错误。然后我尝试施放

int** outputMatrix = (int**)mxGetData(plhs[0]);

获得编译,但结果都是零而没有运气。你能检查一下吗?感谢。

2 个答案:

答案 0 :(得分:4)

我在彼得的帮助下得到了答案。我把它放在这里供其他人参考。

// Output the results 
plhs[0]                     = mxCreateNumericMatrix(col_outputBuff, row_outputBuff, mxINT32_CLASS, mxREAL);
int* outputMatrix           = (int *)mxGetData(plhs[0]);

// Read in the data
for (int col=0; col < col_outputBuff; col++) {
    for (int row=0; row < row_outputBuff; row++) {
        outputMatrix[row + col*row_outputBuff] = outputBuff[col][row];
    }
}

答案 1 :(得分:1)

您的代码存在的问题是,您无法清楚地了解分配对变量的作用。如果您分配outputMatrix = mxCreate...(),然后分成两行outputMatrix = somethingelse,那么您已覆盖了该值。 C中的赋值取右边的值并存储到左边的变量中。

实际上整件事情要简单得多:

// Create the output array, including memory buffers
plhs[0] = mxCreateNumericMatrix(col_outputBuff, row_outputBuff, mxINT32_CLASS, mxREAL);
// Get the pointer to the memory where you should store the data
int* outputBuffer = (int*)mxGetData(plhs[0]);
int* inputBuffer  = (int*)mxGetData(prhs[4]);

for (int col=0; col < col_outputBuff; col++) {
    for (int row=0; row < row_outputBuff; row++) {
        outputBuffer[row + col*row_outputBuff] = inputBuffer[row + col*row_outputBuff];
     }
}

那就是它。请注意,我像输入一样索引输出矩阵:作为连续的内存缓冲区,使用乘法。

如果您现有的代码确实需要C风格的2D矩阵,那么在最后一步将其转换为这种方式。