3

Octave で次の 2 つのコードを書きました。

マトリックス「img」が与えられた場合、次のことを行いました。

255 に等しくないすべての要素を 0 に置き換えます。

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

すべての負の要素を 0 に置き換え、255 より大きいすべての要素を 255 に置き換えます。

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

これをもっと簡単に書く方法はありますか?

4

1 に答える 1

10

MATLABのようなOctaveは、行列またはベクトルの計算用に最適化されています。つまり、行列の乗算、逆行列の計算、2つの行列の加算などで非常にうまく機能する、最適化されたコンパイル済みコードが多数あります。

一方、forループを作成すると、これらの最適化されたコードを利用できず、解釈する必要があるため、通常、同じことを行うのにはるかに長い時間がかかります。

ベクトル(または行列)の形式でコードを記述したり、その形式に変換したりするスタイルは、「ベクトル化」と呼ばれます。

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

2番目のケースでは、次のようなことを試してください。

  img(img<0) = 0;

  img(img>255) = 255; 

最初のケースでは、次のようなものです。

  img(img ~= 255) = 0; 
于 2013-03-16T14:37:41.117 に答える