2014-02-14 62 views
1

我收到了關於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]); 

獲得編譯,但結果都是零而沒有運氣。你能檢查一下嗎?謝謝。

回答

3

我在彼得的幫助下得到了答案。我把它放在這裏供別人參考。

// 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]; 
    } 
} 
+0

確切地說,我認爲在這之後你需要在matlab中轉置結果。首先改變索引,就像你做的(cols,rows),然後回到matlab轉置。 – mike

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矩陣,那麼在最後一步將其轉換爲此樣式。

+0

嗨,彼得,非常感謝。請參閱我上面的編輯。 –

+0

您更改了我的代碼以訪問outputBuffer。別。 MATLAB數組是一個單獨的內存緩衝區。既然你需要一個二維矩陣,然後像你在第一個例子中那樣分配一個(稱爲不同的)mxCalloc,然後在最後一步中,用我的代碼將它逐個元素複製到outputBuffer中。 – Peter

+0

嗨,彼得,我用我的Edit2再次嘗試,但仍然無法正常工作。請幫我檢查一下。非常感謝。 –