我有這段代碼,這是非常長的運行,我想知道是否有可能做一個更快的運行優化或矢量化?如何對for循環進行優化?
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
我有這段代碼,這是非常長的運行,我想知道是否有可能做一個更快的運行優化或矢量化?如何對for循環進行優化?
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
有一個比使用'parfor'更好的方法。如果你想使用'parfor',你也需要並行計算工具箱。 – rayryeng
您更好地幫助 –
提供的數據請提供_minimal_一套每個人都可以用來運行代碼的示例數據。 – Hoki
排序?重複的Mbb值(:,1)? pt(:,1)中的重複值?推測整數值和嚴格正值?大概這個範圍並不是很大,因爲你正在索引一個圖像?看起來我們可以省略'coord'交叉點,因爲它不會與循環交互。 – Peter