2017-08-09 407 views
0

我試圖實現一個mexFunction()到「純」C++(OpenCV),但返回值mxGetPr()對我來說根本不清楚。mxGetPr()的返回值 - 等價循環

下面的代碼的目的是要實現:

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
    { 

     int *D = new int[N*L]; 

     // where N and L are dimensions (cols and rows) of matrix prhs[3] 
     // prhs[3] is a NxL matrix containing floating point value 

     for (int i=0; i<N*L; i++) 
      D[i] = mxGetPr(prhs[3])[i]; 


    } 

我的問題是,什麼樣的價值是由mxGetPr(prhs[3])[i]mxGetPr(prhs[4])[i]給出?它是如何循環矩陣?

我試圖做這樣的事情:

for (int i=0; i<l; i++) 
    { 
     for(int j=0; j<n; j++) 
     { 
      D[iCounter] = (int)d.at<uchar>(i,j); 
      iCounter++; 
     } 
    } 

通過d矩陣是相同的輸入值prhs[3]循環,但顯然這是不正確的。 我猜想返回值的順序/類型與原始mexFunction不一樣。

編輯

現在我的簡歷::墊d;而不是prhs [3],並嘗試像mexfunction一樣做。

int *D = new int[N*L]; 

int iCounter = 0; 

for (int i=0; i<L; i++) 
    { 
     for(int j=0; j<N; j++) 
     { 
      D[iCounter] = (int)d.at<uchar>(i,j); 
      iCounter++; 
     } 
    } 

但在這裏(INT)d.at(I,J)返回 「d」 矩陣......凡在roiginal代碼的指針被mxGetPr()返回的值。

回答

2

​​返回類型爲double的指針,以便您可以使用指針算術來訪問您的數據。另外,您必須記住返回給您的指針具有列專業順序中的數據。這意味着你必須按照傳統的C順序遍歷你的數據,而不是像列一樣。

在列優先的順序,你用下面的線性索引來訪問位置(i, j)

j * rows + i 

rows是在你的矩陣的行數,與ij是您要訪問的行和列。在行優先或C順序,您可以訪問數據的方式是:

i * cols + j 

這裏cols是在你的矩陣的列數。我假設你想要以行主格式而不是列主格式來佈局數據。因此,如果你想通過使用兩個for循環的數據環路,做這樣的事情:

double *ptr = mxGetPr(prhs[3]); 

// A L x N matrix - L rows, N columns 
for (int i = 0; i < L; i++) 
{ 
    for (int j = 0; j < N; j++) 
    { 
     D[i * N + j] = (int) ptr[j * L + i]; 
    } 
} 

這裏D是指向整型數據的指針。您必須投入數據才能執行此操作,因爲指向MATLAB數據的指針已經是double。這很討厭,但這就是你必須做的。您可以按行優先順序使用D,以便與代碼的其餘部分兼容。我假設你正在使用MATLAB MEX作爲預先編寫的C++代碼與MATLAB接口的方式。

+0

我已編輯了一下代碼。 * D指向具有int值的容器的指針。但是輸入矩陣具有浮點值,那麼mxGetPr(prhs [3])[i]實際上是否返回到D [i]?你可以幫我嗎? – Kristan

+0

@Kristan在存儲之前將數據轉換爲int。我將編輯我的帖子。這並不安全,但這就是你所做的。來自MATLAB的輸入矩陣也是**浮點數?也就是說,當你調用你的MEX函數時,是你的MEX函數中的第三個輸入參數的輸入類型**還有**類型的double或浮點數?在編輯我的帖子之前,這很重要。 – rayryeng

+0

是的,輸入矩陣有浮點值。我想要做的是,而不是使用mxGetPr(),我想使用其他(最好是OpenCV)函數返回與mxGetPr()一樣的值。原因是我不再使用原始的Matlab代碼,而是「純粹」的C++(OpenCV)。 – Kristan