次のコード計算の速度を改善しようとしています:
for i=1:5440
for j=1:46
for k= 1:2
pol(i,j,k)= kr0*exp(0.8*k*0.1)*(abs((I(i)*exp(-0.1*j*2.5))^0.9)+0.0);
end
end
end
は5440I
個の値を持つベクトルです。
3 つの for ループを回避して、この操作の速度を上げる方法はありますか? 私は正しい解決策を見つけることができません。
ありがとう
次のコード計算の速度を改善しようとしています:
for i=1:5440
for j=1:46
for k= 1:2
pol(i,j,k)= kr0*exp(0.8*k*0.1)*(abs((I(i)*exp(-0.1*j*2.5))^0.9)+0.0);
end
end
end
は5440I
個の値を持つベクトルです。
3 つの for ループを回避して、この操作の速度を上げる方法はありますか? 私は正しい解決策を見つけることができません。
ありがとう
bsxfun
ベクトル化に使用
f1 = @(a,b) (abs((a.*exp(-0.1*b*2.5)).^0.9)+0.0);
f2 = @(c,d) kr0*exp(0.8*c*0.1).*d;
pol = bsxfun(f2, permute(1:2, [3 1 2]), bsxfun(f1, I(:), 1:46));
配列1:2
は 3 次元であるため、 size の行列を size の行列に変換する必要があることpermute
に注意してください。1x2
1x1x2
比較用ベンチマークはこちら
kr0=1;
I=rand(5440,1);
[pol0, pol] = deal(zeros(5440, 46, 2));
tic
for mm = 1:10,
for i=1:5440
for j=1:46
for k= 1:2
pol0(i,j,k)= kr0*exp(0.8*k*0.1)*(abs((I(i)*exp(-0.1*j*2.5))^0.9)+0.0);
end
end
end
end
toc
tic
for mm=1:10
f1 = @(a,b) (abs((a.*exp(-0.1*b*2.5)).^0.9)+0.0);
f2 = @(c,d) kr0*exp(0.8*c*0.1).*d;
pol = bsxfun(f2, permute(1:2, [3 1 2]), bsxfun(f1, I(:), 1:46));
end
toc
isequal(pol0,pol)
どちらが返されますか
Elapsed time is 1.665443 seconds.
Elapsed time is 0.306089 seconds.
ans =
1
5 倍以上高速で、結果は同等です。
MATLAB は列優先であるため、ループを維持したい場合は、i、j、k ではなく k、j、i の順序で変数をループすることで、速度を上げることができるはずです。