【问题标题】:How to improve performance in matlab operation with 3 for loops?如何使用 3 个 for 循环提高 matlab 操作的性能?
【发布时间】:2013-09-13 08:58:04
【问题描述】:

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

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循环,提高这个操作的速度?我找不到合适的解决方案。

谢谢

【问题讨论】:

  • 如果您还没有这样做,初始化 3D 数组 pol 会有所帮助。 pol=zeros(5440,46,2);

标签: performance matlab for-loop vectorization


【解决方案1】:

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

【讨论】:

    【解决方案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);
    

    【讨论】:

    • 比原始方法更具可读性和速度,但比bsxfun慢。
    • 是的,你的方法比我机器上的方法快大约 3 倍。我得到:0.1181, 0.0151, 0.0382 秒(对应三环、bsxfun、ndgrid 方法):pastebin.com/f5PnRf63
    • 这是可以理解的,因为您的方法需要填充三个大矩阵ijk,并在进行计算时对所有这些矩阵的所有元素进行索引。但是,它仍然不太容易出错,因为bsxfun 需要分离维度。
    • 谢谢大家。我已经尝试了这两种解决方案,我会使用这个。我发现它对我来说更容易,并且计算速度提高就足够了。这些天我将更改所有程序并发布更改之前(超过 30 分钟)和之后的总计算时间的报告。
    • 我几乎改变了所有的循环,新的计算时间大约是 200 秒。我将尝试更改所有其他循环以进一步减少该时间。
    【解决方案3】:

    MATLAB 是列优先的,所以如果你想保持循环,你应该能够通过在 k、j、i 顺序而不是 i、j、k 中循环你的变量来获得一些速度。

    【讨论】:

      猜你喜欢
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多