2017-04-19 113 views
0

我有這段代碼,這是非常長的運行,我想知道是否有可能做一個更快的運行優化或矢量化?如何對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 
+1

您更好地幫助 –

+0

提供的數據請提供_minimal_一套每個人都可以用來運行代碼的示例數據。 – Hoki

+0

排序?重複的Mbb值(:,1)? pt(:,1)中的重複值?推測整數值和嚴格正值?大概這個範圍並不是很大,因爲你正在索引一個圖像?看起來我們可以省略'coord'交叉點,因爲它不會與循環交互。 – Peter

回答

0

你花太多的時間比較pt(t,1)Mbb(u,1)找到匹配,在雙循環。如果相應的尺寸很大,則可能代價很高(O(NM))。

你可以做的是預先對這些數組進行排序,並通過類似合併的過程來搜索相等的值,只需要執行O(N+M)操作。


無論如何,注意,如果陣列ptMbb包括許多相同的元件,它們也是陣列之間相等時,問題可退化爲NM匹配。在這種情況下,排序技巧不能幫助。

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 
+1

有一個比使用'parfor'更好的方法。如果你想使用'parfor',你也需要並行計算工具箱。 – rayryeng