如何优化for循环?

时间:2017-04-19 14:56:28

标签: matlab for-loop optimization

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

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

2 个答案:

答案 0 :(得分:0)

您需要花费大量时间来比较pt(t,1)Mbb(u,1),以便在双循环中找到匹配项。如果相应的尺寸很大,则成本很高(O(NM))。

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

无论如何,请注意,如果数组ptMbb包含许多相等的元素,这些元素在数组之间也相等,则问题可能会退化为NM个匹配项。在这种情况下,排序技巧无法提供帮助。

答案 1 :(得分:0)

尝试多线程。即使在单核上,多线程也可以提高核心的效率。如果你有一个多核系统,那么多线程将产生更多的好处。在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