オクターブ ループは遅い、遅い、遅い、配列単位の操作で物事を表現する方がはるかに優れています。この3 次元オクターブ グラフィックスの例のように、2 次元ドメインで単純な三角関数を評価する例を見てみましょう(ただし、プロットとは対照的に、計算にはより現実的な点数を使用します)。
vectorized.m:
tic()
x = -2:0.01:2;
y = -2:0.01:2;
[xx,yy] = meshgrid(x,y);
z = sin(xx.^2-yy.^2);
toc()
これを for ループに変換すると、forloops.m が得られます。
tic()
x = -2:0.01:2;
y = -2:0.01:2;
z = zeros(401,401);
for i=1:401
for j=1:401
lx = x(i);
ly = y(j);
z(i,j) = sin(lx^2 - ly^2);
endfor
endfor
toc()
ベクトル化されたバージョンは、よりシンプルで読みやすいという点で既に「勝っている」ことに注意してください。しかし、別の重要な利点もあります。タイミングは劇的に異なります。
$ octave --quiet vectorized.m
Elapsed time is 0.02057 seconds.
$ octave --quiet forloops.m
Elapsed time is 2.45772 seconds.
したがって、for ループを使用していて、オーバーヘッドのない完全な並列処理を行っていた場合、非 for ループとのバランスを取るために、これを 119 個のプロセッサに分割する必要があります。
誤解しないでいただきたいのですが、並列処理は優れていますが、まずシリアルで効率的に動作するようにしてください。
octave の組み込み関数のほとんどすべては、スカラーまたは配列全体で同等に機能するという意味で、既にベクトル化されています。そのため、要素ごとに処理を行うのではなく、配列操作に変換する方が簡単な場合がよくあります。それほど簡単ではない場合は、通常、役立つユーティリティ関数 (2 つのベクトルのデカルト積から 2 次元グリッドを生成する meshgrid など) が既に存在することがわかります。