[英]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)
操作。
无论如何,请注意,如果数组pt
和Mbb
包含许多相等的元素,并且在数组之间也相等,则该问题可能会退化为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.