わかりました、この投稿は本当に私を悩ませました。
私はbsxfunについて聞いたことがありません。私はarrayfun、cellfun、structfunを使用していました。それで、なぜそれを使うのかをさまよいましたが、答えはすぐに見つかると思いました。だから私は愚かなテストをしました:
X = magic(3);
tic
Y = bsxfun(@minus, X, min(X(:)));
X_normalized = bsxfun(@rdivide, Y, max(Y(:)));
toc
tic
arrayfun(@(x) x-min(X(:))./(max(X(:))-min(X(:))),X);
toc
そして、私は答えを得ました:
Elapsed time is 0.004130 seconds.
Elapsed time is 0.002468 seconds.
、これにより、arrayfunが進むべき道であることがわかりました。しかし、X が小さいデータであるため、arrayfun の方が速いだけである可能性があるため、より大きな X ( X = magic(100);
) で試しました。確かに、bsxfun の方がはるかに高速です。つまり、いくつかのコードを書き直す必要があります。
Elapsed time is 0.003342 seconds.
Elapsed time is 0.395347 seconds.
しかし、調査結果に満足できず、偶然ではないことを確認するために、テストを数回実行することにしました。そして、これが邪魔になり始めるときです。
test= repmat({zeros(2,10)},2,1);
Xsizes = [3 100];
for ii=1:2,for jj=1:10
X = magic(Xsizes(ii));
tic
Y = bsxfun(@minus, X, min(X(:)));
X_normalized = bsxfun(@rdivide, Y, max(Y(:)));
test{ii}(1,jj)=toc;
tic
arrayfun(@(x) x-min(X(:))./(max(X(:))-min(X(:))),X);
test{ii}(2,jj)=toc;
end;end
display('small Size data')
test{1}
display('Big Size data')
test{2}
そして、答えは、小さなデータの場合は常により高速な arrayfun であり、大きなデータの場合はより高速な bsxfun であると予想されます。ただし、どちらの場合も bsxfun の方が高速であり、セットの初回の計算に時間がかかります。
small Size data
ans =
1.0e-03 *
0.4900 0.0470 0.0430 0.0410 0.0410 0.0420 0.0420 0.0410 0.0420 0.0410
0.6600 0.4200 0.4040 0.3890 0.3920 0.3900 0.3920 0.3890 0.3960 0.3900
Big Size data
ans =
0.0003 0.0001 0.0001 0.0001 0.0001 0.0001 0.0002 0.0001 0.0001 0.0001
0.3853 0.3871 0.3846 0.3855 0.3874 0.3844 0.3863 0.3840 0.3860 0.3853
これは私を困惑させます。for ループの外側で再度計算するとX=magic(3)
、bsxfun は常に arrayfun よりも多くの時間を消費します。
Elapsed time is 0.004891 seconds.
Elapsed time is 0.002008 seconds.
Elapsed time is 0.003181 seconds.
Elapsed time is 0.001994 seconds.
Elapsed time is 0.003109 seconds.
Elapsed time is 0.002008 seconds.
ヒントはありますか?