如何用3 for循环提高matlab操作的性能?

时间:2013-09-13 08:58:05

标签: performance matlab for-loop vectorization

我正在尝试提高以下代码计算的速度:

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

其中I是具有5440个值的向量。

有没有办法避免三个for循环并提高此操作的速度?我找不到合适的解决方案。

谢谢

3 个答案:

答案 0 :(得分:3)

使用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倍以上,结果相同。

答案 1 :(得分:2)

怎么样:

[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);

答案 2 :(得分:0)

MATLAB是列专业的,所以如果你想保持循环,你应该能够通过循环变量以k,j,i顺序而不是i,j,k来加快速度。