2012-03-19 10 views
1

私はまったくドキュメントの単純な例のために、matlabの思考のベクトル化の方法を得ていません。私は誰かが私の理解を少し助けてくれることを願っています。ベクトル化コード

私が達成しようとしているのは、ncols x nrows x ielementsの行列からNxNのサンプルを取り出し、各要素の平均を計算し、平均値の最大値を格納することです。 forループを使用すると、コードは次のようになります。

for x = 1+margin : nrows-margin 
    for y = 1+margin : ncols-margin 
     for i=1:ielem 
      % take a NxN sample 
      sample = input_matrix(y-margin:y+margin,x-margin:x+margin,i) 
      % compute the average of all elements 
      result(i) = mean2(sample); 
     end %for i 
     % store the max of the computed averages 
     output_matrix(y,x)=max(result); 
     end %for y 
    end %for x 

誰でもこの状況の良い例をベクトル化できますか? T

+0

'conv2'または' filter2'関数を見てください。 –

+0

私はそうするでしょうが、conv2やfilter2のような関数を使ってこのタイプのコードをベクトル化し、より多くの行列インデックスを使用する方法はありますか? – VisLab

答えて

2

まずベクトル化は、コードを実行する前にコードをコンパイルする機能が強化されているため、それほど重要ではありませんが、まだ非常に一般的な方法であり、いくつかの拡張が可能です。古いMatlabのバージョンは一度に1行で実行され、forループは同じコードのベクトル化されたバージョンよりずっと遅くなります。

ベクトル化できる行列の一部は、内側のforループです。あなたがしようとしていることの簡単な例を示します。私はあなたがその例をとり、あなたのコードに入れさせるでしょう。

input=randn(5,5,3); 
max(mean(mean(input,1),2)) 

基本的に、内側の2つmeanは、入力配列の平均を取り、外側maxの範囲にわたる最大値を見つけます。あなたが望むならば、それを段階的に壊して、それが何をするか見ることができます。 mean(input,1)は、最初の次元では平均をとり、2番目の次元ではmean(input,2)などとなります。最初の2つの方法が完了すると、残っているのはベクトルです。これはmax関数が簡単に機能するようにします。ベクトルpre-maxのサイズは[1 1 3]であり、この操作を行うときには寸法が保持されることに留意すべきである。

関連する問題