2016-08-09 14 views
0

私は論文のいずれかの目的関数を書いています。それは次のようにネストされたループを必要とします:MATLABのネストされたforループの実行時間を短縮します

for j=1:m 
    if j==m   
     for i=1:n   
      consumedE(j) = consumedE(j)+ b(i,j)*e(i,j); 
      for k=1:m-1 
       for l=1:n     
        consumedE(j) = consumedE(j) + b(i,j)*(et(end)*Data(i).Vin);      
       end     
      end   
     end 
    else 
     for i=1:n 
      consumedE(j) = consumedE(j) + b(i,j)*(e(i,j)+et(j)*Data(i).Vout); 
     end 
    end 
end 

、mとnが何かは約200

、それは非常に強力なPC上でも、非常に時間がかかります。どうすればスピードアップできますか?

+1

サンプル入力を提供するか、少なくとも関連するすべてのベクトル/配列/構造体のサイズを指定してください。 [mcve]を参照してください。 –

+1

コードの[ベクトル化](http://ch.mathworks.com/help/matlab/matlab_prog/vectorization.html)を使用すると、スピードアップを図ることができます。 MatlabはC言語ではありません。ループの代わりにベクトル化された演算を使用して、ベクトルと行列にアクセスして操作する方が効率的です。 –

答えて

0

内部ループでは、内部インデックスをまったく参照しません。

 for k=1:m-1 
      for l=1:n     
       consumedE(j) = consumedE(j) + b(i,j)*(et(end)*Data(i).Vin);      
      end     
     end 

これはと同一である必要があります:私は、これが大幅にパフォーマンスを向上するために期待される

consumedE(j) = consumedE(j)+ (m-1)*n*b(i,j)*(et(end)*Data(i).Vin); 

0

ランダムなサンプルデータを作成しましょう。 Data(i).VoutをベクトルDataVoutに簡略化しました。 [Data.Vout].'で簡単にそれを行うことができます。 Data.Vinと同じです。今

m = 10; 
n = 5; 
b = rand(n,m); 
e = rand(n,m); 
et = rand(1,m); 
DataVout = rand(n,1); 
DataVin = rand(n,1); 

、あなたのelse節を使用すると、それぞれの組み合わせのために次の操作を行い、すべてのij、ループスルーです:

b(i,j) * (e(i,j) + et(j) * Data(i).Vout) 

、その後、あなたはすべてのi年代を超える合計。次の手順でベクトル化の方法でそれを行うことができます。

  1. 行列の乗算DataVout * etet(j) * DataVout(i)を含む行列を作成します。この行列のサイズはn-by-mであり、これはeおよびbと同じサイズです。
  2. この行列にeを追加し、結果とbの間に要素ごとの乗算を行います。これは:b .* (e + DataVout * et)
  3. 合計行の合計:consumedE = sum(b .* (e + DataVout * et), 1)です。

最後の値、j==mは、あなたの計算には特別なものです:あなたはどんな計算でklを使用していないとして、あなたは、内側の計算n * (m-1)回繰り返します。これは、前の計算と同一である

b(i,j) * (e(i,j) + n * (m-1) * et(j) * Data(i).Vin) 

になる - そのData.Voutn*(m-1)*Data.Vinに置き換えられる点が異なります。 j=mと固定されているため、前の計算を簡略化できます。 sum(b(:,m) .* (e(:,m) + n * (m-1) * DataVin * et(m)), 1)になります。一緒に

すべては、あなたの全体のコードは次のようになります。

consumedE = sum(b .* (e + DataVout * et), 1); 
consumedE(m) = sum(b(:,m) .* (e(:,m) + n * (m-1) * DataVin * et(m)), 1); 

比較:m=200n=150のために、あなたのコードは、私のマシン上で0.109523 secondsかかります。ベクトル化されたコードは、0.005665 secondsで、20倍のスピードアップです。

関連する問題