我有这部分代码,运行时很长,我想知道是否可以进行优化或矢量化以便更快地运行?
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
答案 0 :(得分:0)
您需要花费大量时间来比较pt(t,1)
和Mbb(u,1)
,以便在双循环中找到匹配项。如果相应的尺寸很大,则成本很高(O(NM)
)。
您可以做的是对这些数组进行预排序,并通过类似合并的过程搜索相等的值,仅执行O(N+M)
次操作。
无论如何,请注意,如果数组pt
和Mbb
包含许多相等的元素,这些元素在数组之间也相等,则问题可能会退化为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