ランダムなサンプルデータを作成しましょう。 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節を使用すると、それぞれの組み合わせのために次の操作を行い、すべてのi
とj
、ループスルーです:
b(i,j) * (e(i,j) + et(j) * Data(i).Vout)
、その後、あなたはすべてのi
年代を超える合計。次の手順でベクトル化の方法でそれを行うことができます。
- 行列の乗算
DataVout * et
はet(j) * DataVout(i)
を含む行列を作成します。この行列のサイズはn-by-mであり、これはe
およびb
と同じサイズです。
- この行列に
e
を追加し、結果とb
の間に要素ごとの乗算を行います。これは:b .* (e + DataVout * et)
- 合計行の合計:
consumedE = sum(b .* (e + DataVout * et), 1)
です。
最後の値、j==m
は、あなたの計算には特別なものです:あなたはどんな計算でk
とl
を使用していないとして、あなたは、内側の計算n * (m-1)
回繰り返します。これは、前の計算と同一である
b(i,j) * (e(i,j) + n * (m-1) * et(j) * Data(i).Vin)
になる - そのData.Vout
がn*(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=200
とn=150
のために、あなたのコードは、私のマシン上で0.109523 seconds
かかります。ベクトル化されたコードは、0.005665 seconds
で、20倍のスピードアップです。
サンプル入力を提供するか、少なくとも関連するすべてのベクトル/配列/構造体のサイズを指定してください。 [mcve]を参照してください。 –
コードの[ベクトル化](http://ch.mathworks.com/help/matlab/matlab_prog/vectorization.html)を使用すると、スピードアップを図ることができます。 MatlabはC言語ではありません。ループの代わりにベクトル化された演算を使用して、ベクトルと行列にアクセスして操作する方が効率的です。 –