【发布时间】:2014-02-14 11:00:17
【问题描述】:
我收到了一个关于 Matlab mex 函数输入/输出二维数组格式的后续问题。例如,我有一个变量 '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]);
可以编译代码,但输出的全零与预期不同。你能给我一些提示吗?非常感谢。答:
编辑 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]);
得到编译但结果都是零,没有运气。请给我一张支票好吗?谢谢。
【问题讨论】: