我收到了關於Matlab mex函數輸入/輸出二維數組格式的後續問題。例如,我有一個定義爲C++ 2D整數數組的變量'outputBuff
'。處理完它後,我想輸出它作爲'plhs'(參數在左邊)。不知道如何做到這一點。如何使用Matlab mex輸出2D整數數組?
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矩陣(或二維數組),因爲我將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]);
獲得編譯,但結果都是零而沒有運氣。你能檢查一下嗎?謝謝。
確切地說,我認爲在這之後你需要在matlab中轉置結果。首先改變索引,就像你做的(cols,rows),然後回到matlab轉置。 – mike