繁体   English   中英

如何优化for循环?

[英]How to do an optimization of a for loop?

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

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

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

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


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM