行列の行/列の定数倍の処理と速度

ノルムの正規化などをする際に,行列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が僅差ながらも早いという結果に.