2015-08-29 34 views
2

我的程序會創建一個矩陣。它移動並將它置於一個更大的中心。現在我想填充用第一個矩陣的邊緣值創建的邊界,使其看起來像這樣:visual example通過複製邊緣值來填充矩陣

到目前爲止,我有以下代碼,但它似乎沒有按照它應該工作(讓我們考慮矩陣作爲與寬度,高度和邊界的圖像):

/////////////////////////Up/Down Fill//////////////////////////// 
for(i=border;i<(width+border);i++){ 
    for(j=0;j<(height+2*border);j++){ 
     if(j<border){ 
      fmatr[i][j]=fmatr[i][border]; 
     } 
     else if(j>(height+border)){ 
      fmatr[i][j]=fmatr[i][(height+border)]; 
     } 
    } 
} 

/////////////////////////Left/Right////////////////////////////// 
for(i=0;i<(width+2*border);i++){ 
    for(j=0;j<(height+2*border);j++){ 
     if(i<border){ 
      fmatr[i][j]=fmatr[border][j]; 
     } 
     else if(i>(width+border)){ 
      fmatr[i][j]=fmatr[(width+border)][j]; 
     } 
    } 
} 

任何人都可以指出我在正確的方向如何做到這一點?

回答

1

你是一對一錯誤的受害者。

一般在C,遍歷您使用的起始索引和next_to_last指數,這樣的順序:

for (i = first; i < next_to_last; ++i) 

這是很方便的,因爲next_to_last指數是第一個加上長度:

for (i = first; i < first + length; ++i) 

如果你想知道一個索引超出範圍的使用<>=

out_of_bounds = i < first || i >= next_to_last; 
out_of_bounds = i < first || i >= first + length; 

這一切都很酷,因爲當你有兩個連續的序列你沒有做任何調整,當你從一個到另一個:

for (i = 0; i < a; ++i) ...; 
for (; i < b; ++i) ...; 
for (; i < c; ++i) ...; 

但是,如果你要訪問一個序列的最後一個元素你要記住一個。減去:

last = array[next_to_last - 1]; 
last = array[first + length - 1]; 

所以,當你說:

else if(j>(height+border)){ 
     fmatr[i][j] = fmatr[i][(height+border)]; 
    } 

你大概的意思是:

else if(j >= height + border){ 
     fmatr[i][j] = fmatr[i][height + border - 1]; 
    } 

和witdh run一樣。


這就是說我會把內循環寫成兩個循環。國際海事組織你的意圖是更清晰的這種方式:

for (j = 0; j < border; ++j) 
    fmatr[i][j] = fmatr[i][border]; 
for (j = height + border; j < height + 2 * border; ++j) 
    fmatr[i][j]=fmatr[i][height + border - 1]; 

和寬度運行相同。