2013-03-16 109 views
2

我在Octave中編寫了以下兩段代碼。在第一個例子中,給定一個矩陣'img',我想用0替換所有不等於255的元素。在第二個例子中,我想用0替換所有的負元素,並且用大於255的所有元素替換255.有沒有更簡單的方法來寫這個?在Octave中寫'for'的簡單方法

for i = 1:m 
    for j = 1:n 
     if (img(i,j) ~= 255) 
      img(i,j) = 0; 
     endif 
    endfor 
endfor 


for i = 1:m 
    for j = 1:n 
     if (img(i,j) < 0) 
      img(i,j) = 0; 
     endif 
     if (img(i,j) > 255) 
      img(i,j) = 255; 
     endif 
    endfor 
endfor 
+0

你可以使用一個else-如果在第二個(而不是單獨的if)因爲img(i,j)將是<0 or > 255但不是兩個同時 – RedBaron 2013-03-16 14:14:52

回答

8

Octav like MATLAB優化了矩陣或向量計算。 也就是說,它有很多優化的編譯代碼,可以很好地處理像矩陣乘法或計算逆或添加兩個矩陣等。

另一方面,如果您創建for循環,則無法利用任何這些優化的代碼,必須進行解釋,因此通常需要更長的時間才能完成相同的任務。

以矢量(或矩陣)形式編寫代碼或轉換爲該形式的代碼稱爲「矢量化」。

http://www.gnu.org/software/octave/doc/interpreter/Basic-Vectorization.html

對於你問你應該嘗試這樣的第二種情況:

img(img<0) = 0; 

    img(img>255) = 255; 

對於第一種情況,是這樣的:

img(img ~= 255) = 0;