我正在尝试提高以下代码计算的速度:
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
whereI
是一个有 5440 个值的向量。
有什么办法可以避免三个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
whereI
是一个有 5440 个值的向量。
有什么办法可以避免三个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
在第三维上,我们需要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 倍以上,而且结果是一样的。
怎么样:
[i,j,k] = ndgrid(1:5440,1:46,1:2);
pol = kr0*exp(0.8*k*0.1) .* ( abs((I(i).*exp(-0.1*j*2.5)).^0.9) + 0.0);
MATLAB 是列优先的,所以如果你想保持循环,你应该能够通过在 k、j、i 顺序而不是 i、j、k 中循环你的变量来加快速度。