Scilabでの各行ベクトル/列ベクトルの規格化

Desktopは2 coreがどっちも100%で、このlaptopも2 core中1 coreが100%で稼働していて少々暇なのでメモ。


MATLAB/Scilabを使っていて良くあることとして、列番号が時刻のラベルに対応しており、各列ベクトルが特徴量ベクトルを表している、というような状況がある。この各列ベクトルをEuclid的な意味で規格化したいとする。
当然だがfor loopを使うのは却下。MATLAB/Scilabで行列要素演算にfor loopを使うと劇的に遅くなる。
俺が今までやってきたのは、クロネッカー積とかいう良く分からないもので行列を拡大する方法。これは速いのだがメモリをかなり食う。
同僚の韓国人に教えてもらった方法と共にメモしておく。
ちなみにAはM*Nの行列で、とりあえず全てのn∈NにおいてA(:,n)≠oとしておく。

normalized_1_A = A./(sqrt(sum(A.^2,'r')).*.ones(M,1);
normalized_2_A = A * diag((sum(A.^2,'r').^(-0.5));

1/√の対角行列を作ってしまってその積で解決するという手法は、俺程度の線形代数力では金輪際思いつかないだろう。
ちょっと感動した。まぁその韓国人は当たり前みたいに言ってきたけど。