2016-07-12 16 views
0

現在、平均値を計算するためにネストされた 'for'ループを使用しています。これは3527 * 256ピクセルの画像で、各ピクセルには448の値が含まれています。私はこれらの448の値に 'modis_rsr'(448 * 8)という配列を掛けて、ゼロと正の値だけを合計したいと思います。その後、この和をhyp_1nmの正の値を持つものだけに対応する 'modis_rsr'の値の合計で除算したいと思います。'for'ループを条件付きの行列乗算に変換する

予想通り、このシーケンスは時間がかかりすぎるため、行列乗算を使用して処理を高速化したいと考えています。私が行う方法がわからない唯一のことは、 'modis_rsr'の条件付き合計を含めることです。私は負のもののインデックスを格納するために参照配列を作成することを考えていました。しかし、それはまた、計算集約的なようです。

for j = 1:8 
    for k = 1:256 
     for i = 1:3527 
      RLs = 0; 
      for jj = 1:448 
       if hyp_1nm(i,jj,k)>= 0 
        RLi = hyp_1nm(i,jj,k)*modis_rsr(jj,j); 
        RLs = RLs + RLi; 
        temp_rsr(jj,j) = modis_rsr(jj,j); 
       else 
        temp_rsr(jj,j) = 0; 
       end 
      end 
      Rs = sum(temp_rsr(1:448,j)); 

      % Write basr 
      basr(i,j,k) = RLs/Rs; 
     end 
    end 
end 
+0

各ピクセルに448の値が含まれていると言うと、3527 * 256 * 448サイズのe 3次元行列があることを意味します。右?あなたが返信すると、私はあなたを助けることができるかもしれません。 簡単にするために、コードを読む人(自分自身を含む)を混乱させる変数名は使用しないでください。 jjを使用する代わりに、別の文字または単語を使用します。 –

+0

こんにちはTayyib、返事をありがとう。うん、それは3D配列です。悪い変数名を残して申し訳ありません。 –

答えて

2

あなたは、この場合にはループを使用して避けることができないようにするには、MATLAB 1つの特定の次元に沿って配列を掛けることができません。しかし、論理インデックスと要素ごとの乗算を使用することで、ループの数を減らすことができます。本当にあなたがforループを回避したい場合は

for j = 1:8 
     for k = 1:256 
      for i = 1:3527 
       RLs = 0; 
       ind = hyp_1nm(i,:,k) >= 0; %by using the logical indexing you can avoid 1 loop. 
       RLs = sum(hyp_1nm(i,ind,k).*modis_rsr(ind,j)'); % .* = element-wise multiplication 
       temp_rsr(ind,j) = modis_rsr(ind,j); 
       temp_rsr(~ind,j) = 0; 
       Rs = sum(temp_rsr(1:448,j)); 
       basr(i,j,k) = RLs/Rs; 
      end 
     end 
    end 

、あなたが機能bsxfunを使用できますが、bsxfunだけfoorループを隠し、それはあなたのコードを線形化していません。

+0

論理的な索引付けは非常に便利です。ありがとう! –