2013-08-21 32 views
-1

通過創建單元陣列即backgroundSample{1}backgroundSample{2},...,backgroundSample{9}的灰度圖像的background的MATLAB代碼樣品部分。這裏halfRowshalfCols是圖像的一半大小。由於backgroundSample是一個包含九個二維矩陣的數組,它讓我很困惑,如何在C/C++中編寫這段代碼。我可以使用類似backgroundSample[i].elements[m][n]的東西獲得backgroundSample{i}的元素嗎?書寫MATLAB陣列在C/C++

MATLAB代碼:

offset = [-60, -20, 20, 60]; 
for i = 1: 1: 3        
    for j = 1: 1: 3 
     backgroundSample{(i - 1) * 3 + j} = 
     background(halfRows + offset(i): halfRows + offset(i + 1), ... 
        halfCols + offset(j): halfCols + offset(j + 1)); 
    end; 
end; 

編輯:
我們可以簡單地通過A = B在MATLAB分配矩陣。舉個例子,backgroundSample{1} = background(60: 100, 60: 100)在我的問題和這個任務是在i:1→3和j:1→3的循環中。但是,在C/C++中分配矩陣時,應該逐一分配每個元素。也許是這樣的:

for(int i = 0; i < 3; i++) 
    for(int j = 0; n < 3; j++) 
     // to get every elements 
     for(int m = 0 ...) 
      for(int n = 0 ...) 
       // not sure whether there is such usage of "->" in array 
       backgroundSample[(i - 1) * 3 + j]->elements[m][n] = background[i iteration][j iteration] 

因此,有矩陣backgroundSample[m][n]background[i][j]的指數之間的衝突。如何解決這個問題?

+1

你想寫一個MEX文件,或者只是一個等效的C/C++程序? –

+0

@EitanT我在寫一個等效的C/C++程序 – WangYudong

+1

那麼究竟是什麼問題呢?聲明一個由9個指向2-D矩陣的指針組成的數組,併爲每個矩陣分配足夠的內存。訪問第_i_-th矩陣中的元素可能看起來像'backgroundSample [i] - > elements [j] [k]' –

回答

0

實施你描述的最簡單的方法是聲明多維數組:

int backgroundSample[9][3][3]; 

其中假定每個2 d矩陣的尺寸爲3×3。要訪問(Ñ)在ķ個矩陣元素,則寫backgroundSample[k][m][n]例如

for (int m = 0; m < 3; ++m) 
{ 
    for(int n = 0; n < 3; ++n) 
    { 
     backgroundSample[(i - 1) * 3 + j][m][n] = background[i][j]; 
    } 
} 

替代地,如果在該數組存儲每個樣本的更多信息,則可以聲明的結構:

typedef struct 
{ 
    int elements[3][3]; 

    // More fields... 
} TSample; 

,然後創建這些數組:

TSample backgroundSample[9]; 

要訪問一個元素,你會寫backgroundSample[k].elements[m][n]

還有(在運行時,這意味着你不知道有多少,這些結構你事先有)動態分配內存的可能性:

TSample* backgroundSample; 

在C++內存分配的實際過程看起來像這樣:

backgroundSample = new TSample[9]; 

訪問元素將通過編寫backgroundSample[k]->elements[m][n]完成。請注意數組運算符->,它通過解引用指針backgroundSample[k]來訪問字段elements

注:每次調用new需要以釋放內存,我這樣做時將伴有相應地調用delete。Ë

delete[] backgroundSample; 

希望幫助!

+0

謝謝,但可能存在一個錯誤:你的代碼'backgroundSample [(i-1)* 3 + j] [m] [n] = background [i] [j];'也應該在i和j的循環中,對嗎?所以這樣'backgroundSample [0] [m] [n]'將被分配相同的值,因爲'background [i] [j]'不會改變,直到它跳出循環m&n。 – WangYudong

+0

是的,這只是一個用法的例子。假設它是在迭代'i'和'j'的嵌套for循環中,就像假定數組'background'定義在其他地方一樣。顯然,你應該根據你的需要修改它。 –