2017-10-21 27 views
0

私はmatlabでコーディングしていますが、matlabは "for"ループではうまく動作しないので、できるだけ早く行うことができます。ここでは "for"を扱う私のコードの一部です。行列計算のforループを避ける

for i = 1:size(U,1) 
    for j=1:size(U,2)   
     v(i,j) = U(mod(i+1-1,size(U,1))+1,j) + U(i,mod(j+1-1,size(U,2))+1) ... 
       + U(mod(i-1-1,size(U,1))+1,j) + U(i,mod(j-1-1,size(U,2))+1) - 4*U(i,j); 
    end 
end 

私のマトリックスには周期的な境界条件があります。そのため、「mod」関数を使用しています。 このコードはmatlabの "del2"関数と実際に似ていますが、matlabのバージョンは周期的な境界条件では機能しません。 meshgridを使用して

+3

matlabが "for"ループでうまく動作しない理由を説明してください –

+0

@BradDay "for"ループが多すぎると、同じコードを別の言語で書くとシミュレーションの実行時間を長くすることができますC++のようなプログラミングは速くなるでしょう。とにかく、 "for"のようなループ構造の代替案を探しています。それはそれです... – aaa

+0

Hmm。あなたがラプラシアンのためにU(i、j)の隣人を見る必要があるので、反復的なプロセスなしにこれができる方法は見当たりません。 MATLABがコードをあまりにも遅く実行していると私が提案できる唯一のことは、[parfor](https://www.mathworks.com/help/distcomp/parfor.html)で並列forループを利用しようとすることです。 –

答えて

0

ベクトル化バージョン:

[n,m] = meshgrid(1:size(U,2),1:size(U,1)); 
v = U(sub2ind(size(U),mod(m,size(U,1))+1,n)) + U(sub2ind(size(U),m,mod(n,size(U,2))+1)) ... 
    + U(sub2ind(size(U),mod(m-2,size(U,1))+1,n)) + U(sub2ind(size(U),m,mod(n-2,size(U,2))+1)) - 4.*U; 

あなたはまたpreallocating memoryによって(大きさの複数の注文により、可能性の高い)ループをスピードアップすることができます。この場合は、ループの前に

v = zeros(size(U)); 

と入力するだけです。

関連する問題