【问题标题】:How to do an optimization of a for loop?如何对for循环进行优化?
【发布时间】:2017-04-19 14:56:28
【问题描述】:

我有这部分代码运行时间很长,我想知道是否可以进行优化或矢量化以加快运行速度?

if intersect(pt, coord,'rows')                    
  for t=1:size(pt,1)
    for u=1:size(Mbb,1)
      if  pt(t,1)==Mbb(u,1)
        img(pt(t,1),Mbb(u,2))=1;
      end
    end
  end
end

【问题讨论】:

  • 你最好提供数据寻求帮助
  • 请提供一个最少组样本数据,每个人都可以用来运行你的代码。
  • 排序了吗? Mbb(:,1) 的重复值? pt(:,1) 中的重复值?大概是整数值和严格正数?并且大概范围不是很大,因为您正在索引图像?看起来我们可以省略 coord 交叉点,因为它不会与循环交互。
  • 您可以使用 pdist2 查找 0 距离,然后将其用作逻辑索引。无需循环。

标签: matlab for-loop optimization


【解决方案1】:

尝试多线程。即使在单核上多线程也可以提高你的核心效率。如果你有一个多核系统,那么多线程将产生更多的好处。在 MATLAB 中,这是使用 parfor 完成的。请注意,只有在循环迭代之间没有依赖关系时才能这样做。您的代码必须看起来像这样。有时 MATLAB 解释器在检测依赖关系时会过于保守,因此您必须以这样一种方式编写循环,即解释器在迭代中看不到依赖关系

if intersect(pt, coord,'rows') 
  loopsize=size(pt,1);                   
  parfor t=1:loopsize
    for u=1:size(Mbb,1)
      if  pt(t,1)==Mbb(u,1)
        img(pt(t,1),Mbb(u,2))=1;
      end
    end
  end
end

【讨论】:

  • 有比使用parfor 更好的方法来做到这一点。如果要使用parfor,还需要并行计算工具箱。
【解决方案2】:

您花费大量时间比较 pt(t,1)Mbb(u,1) 以在双循环中查找匹配项。如果各自的尺寸很大,这可能会很昂贵 (O(NM))。

您可以做的是对这些数组进行预排序,并通过类似合并的过程搜索相等的值,只进行O(N+M) 操作。


无论如何,请注意,如果数组ptMbb 包含许多相等的元素,这些元素在数组之间也是相等的,那么问题可能会退化为NM 匹配。在这种情况下,排序技巧就无济于事了。

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 2022-11-03
    • 2012-11-05
    • 1970-01-01
    • 2010-11-15
    • 2011-08-30
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多