【问题标题】:Why inverse for loop in matlab is faster为什么matlab中的逆循环更快
【发布时间】:2015-07-30 20:05:48
【问题描述】:

我最近在 MATLAB 中遇到了这个 for 循环代码,这让我很困惑,因为逆循环做同样的事情更快。为什么会这样?

clear all
a = rand(1000,1000);
b = rand(1000,1000);

for i=1:1000
 for j=1:1000
 c(i,j) = a(i,j) + b(i,j);
 end
end

与逆循环相同的代码:

clear all
a = rand(1000,1000);
b = rand(1000,1000);

for i=1000:-1:1
 for j=1000:-1:1
 c(i,j) = a(i,j) + b(i,j);
 end
end

我在 python 中使用 range(1000,1,-1) 做同样的事情,并找到了相同的结果(反向循环仍然更快)。

【问题讨论】:

  • 我猜因为你没有提前声明c,所以 1->1000 意味着 matlab 每次都必须扩展数组,而 1000->1 则预先构建 1000为您提供项目数组。
  • @MarcB 没错。将其发布为答案!
  • 一直更快?你用什么来计时?
  • @MarcB MATLAB 甚至会对此发出警告,不知道为什么 OP 没有阅读它。
  • 阅读?这是什么?如果阅读变得流行,那么 90% 以上的关于 SO 的问题将是多余的......

标签: python matlab loops


【解决方案1】:

由于您在以相反顺序执行时没有预先分配输出变量 c,因此在第一次 for 循环迭代后,c 最初被预先分配给 1000 x 1000 矩阵。当您计算 c 的大小时,每个循环的大小都会增加,这需要在每次迭代时重新分配内存,因此速度会变慢。如果您打开它们,Matlab 会将此显示为警告。

【讨论】:

    【解决方案2】:

    逆循环更快,因为第一次迭代 (c(1000,1000)=..) 创建了一个大小为 1000x1000 的数组,而第一段代码不断增加变量 c 的大小。

    为避免此类问题,请预先分配您在循环中编写的变量。插入c=zeros(1000,1000),两个版本都运行得很快。您的 matlab 编辑器会向您显示警告(黄线),这些警告表明您的代码存在潜在的性能问题和其他问题。阅读这些消息!

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 2017-06-07
      • 2020-05-11
      • 2012-12-11
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多