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.