matlabスクリプトの高速化
matlabの行列はをfor statementで連続して処理するとき、
左側のindexを操作するfor statementを内側にもってきたほうが、
動作が速い。
このことは昔より知られていたことであるが、
あまりにも大きなパフォーマンスの違いがでるゆえに、
さすがに改善されているのではないかと思ったが、
現在(2015a)においても健在であった。
>> A = zeros( 2000, 2000 );clear A;tic; for i = 1:2000; for j = 1:2000; A(i,j) = i^j;end;end;toc
Elapsed time is 3.276390 seconds.
>> A = zeros( 2000, 2000 );clear A;tic; for i = 1:2000; for j = 1:2000; A(j,i) = i^j;end;end;toc
Elapsed time is 0.441224 seconds.
後者は、処理時間が、前者の1/7 以下である。
なおparforを外側ループに適用すると前者は速くなり、後者は遅くなる。
もっともはやいのはparforを使わない場合の後者である。
ちなみに、for statementを単純なインクリメントではなくランダムな順序で、i,jを変化させるように書き直すと、for statemtnの順序にかかわらず、さらにおそくなる。
>>a = randperm(2000);
>> A = zeros( 2000, 2000 );clear A;tic; for i = a; for j = a; A(j,i) = i^(0.1+j);end;end;toc
Elapsed time is 3.687055 seconds.