行列の行/列の定数倍の処理と速度
ノルムの正規化などをする際に,行列Xの行や列単位で定数倍したい時がありますが,MATLABでどう書くのが一番早いかを測定したので,メモ.
実験コード
N = 3000; D = 1000; A = rand(D,N); B = (1:N); %% 実装1 for i = 1:100 x = bsxfun(@times, A, B); end %% 実装2 for i = 1:100 x = A.*repmat(B,D,1); end %% 実装3 for i = 1:100 x = A*sparse(1:N,1:N, B); end %% 実装4 for i = 1:100 x = A*diag(B); end
時間の測定は,MATLABのプロファイラーを使用.
結果
- 実装1 : 1.19s
- 実装2 : 1.48s
- 実装3 : 1.36s
- 実装4 : 90.47s以上(終了しなかったので,途中で停止)
これまでは実装2をよく使っていたのですが,実装1が僅差ながらも早いという結果に.