MATLABでは配列演算化をベクトル化と呼びます。
以下にMATLABのヘルプ"ベクトル化"の一部を引用します。
MATLABは、行列とベクトルに関する操作に最適化されています。 ループベースでスカラー指向のコードを、 MATLAB 行列とベクトル操作を使用するように変更するプロセスは "ベクトル化" と呼ばれます。
コードのベクトル化の利点は次のとおりです。
- 外観: ベクトル化された数学的なコードは教科書の数式のように示されるので、 コードが理解しやすくなります。
- エラーの発生が少ない: ループがないため、ベクトル化コードはたいてい短くなります。 コード行が少ないほど、プログラミング エラーが発生することも少なくなります。
- パフォーマンス: 多くの場合、ベクトル化コードはループを含む同等のコードよりはるかに高速で実行されます。
多くの場合上記の通りですが、
処理の複雑なfor文や本質的に逐次処理であるコードを無理にベクトル化するとコードが読みにくくなったり、
かえって遅くなることがあります。
そのようなときはfor文とベクトル化の両方を実装して計算時間を比較したほうが望ましいです。
リスト7-1に再帰演算(逐次処理)の一例を示します。
この場合、計算を実行すると下記のようにベクトル化で遅くなります。
26-27行目のような記述もできますが、さらに遅くなります。
なお、本ケースでは並列処理できないために4行目の数値を変えても計算時間は同じです。
>> vector 経過時間は 0.346255 秒です。 ans = 2.4997e+15 経過時間は 0.522655 秒です。 ans = 2.4997e+15 経過時間は 1.864066 秒です。 ans = 2.4997e+15
リスト7-1 ベクトル化に適していないコード (vector.m)
1 % vector.m 2 3 clearvars; 4 %maxNumCompThreads(8); 5 6 n = 100000000; 7 a = zeros(n, 1); 8 b = rand(n - 1, 1); 9 10 % (1) for statement 11 tic 12 for i = 1 : n -1 13 a(i + 1) = a(i) + b(i); 14 end 15 toc 16 sum(a) 17 18 % (2) vector 19 tic 20 a(2:n) = a(1:n-1) + b(1:n-1); 21 toc 22 sum(a) 23 24 % (3) vector (V.2) 25 tic 26 i = 1 : n - 1; 27 a((i) + 1) = a(i) + b(i); 28 toc 29 sum(a)
(注意)
MATLABではスレッド数の既定値は物理コア数です。
4行目の数値を変えて実行したときはそれが既定値として残ります。
テストを終えたら最後に物理コア数に変えて実行した後、4行目をコメントアウトしてください。