Octave
機械学習
MachineLearning
行列演算

なぜfor文は禁止なのか?Octave版

元記事:なぜfor文は禁止なのか?関数型記述のススメ
から色々あって
親記事:何故for文は許されるのか?反省会会場

親記事とその元となっている記事を遡って読んで、「なるほどjavascriptだとそうなるんですね」と目から鱗が落ちたのでOctaveで試してみます。

CourseraのMachine Learningの中でアンドリュー教授は何度も、for文は遅いし機械学習のコードを書くには向かないと言ってました。そこで、使い慣れたOctaveを使って今回のお題である「ゼロから99までの数字から偶数だけを累計」する処理を、for文の場合と行列演算の場合で比較してみます。

まずはfor文を使うパターン。チックタックで、その間の時間を測れるのが素敵です。

tic;
a = [0:99];
total = 0;
for i = 1:100
    if rem(a(i), 2) == 0,
        total = total + a(i);
    end
end
toc;

fprintf('ans=%d\n', total);

> Elapsed time is 1.54901e-03 seconds.
> ans=2450

続いてfor文を使わないパターン。

tic;
a = [0:99];
ans=sum(a(rem(a, 2) == 0));
toc;

fprintf('ans=%d\n', ans);

> Elapsed time is 4.22001e-05 seconds.
> ans=2450

行列演算なら2行で答えに辿り着けますしfor文より桁違いに高速です。それにソースも行列演算の方がエレガントな気がします^^; とういうことで、Octaveを使って機械学習のコードを書くのなら極力for文は回避した方が良さそうです。

使用する言語によって得意不得意がはっきりと出てきそうで面白いですね。