目次

7. ベクトル化について

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行目をコメントアウトしてください。