2012-10-22 55 views
0

這是Profiler報告的一部分,並顯示這些線條如何消耗時間。它可以改進嗎?如何讓此代碼更省時?

  434 %clean up empty cells in subPoly 
     228 435 if ~isempty(subPoly) 
     169 436  subPoly(cellfun(@isempty,subPoly)) = []; 
       437 
       438  %remove determined subpoly points from the hull polygon 
     169 439  removeIndex = zeros(size(extendedPoly,1),1); 
     169 440  for i=1:length(subPoly) 
     376 441   for j=1:size(subPoly{i}(:,1)) 
     20515 442    for k=1:size(extendedPoly,1) 
6.12 5644644 443     if extendedPoly(k,:)==subPoly{i}(j,:) 
     30647 444      removeIndex(k,1)=1; 
     30647 445     end 
1.08 5644644 446    end 
0.02 20515 447   end 
     376 448  end 
     169 449  extendedPoly = extendedPoly(~removeIndex(:,1),:); 
     169 450 end 
+0

你能提供的這個代碼做什麼解釋? – Dan

+0

根據比賽是否可能或不太可能,您可能會通過重新排序循環以獲得巨大收益,以便k在外部。然後,對於任何i/j與k的第一次匹配,可以設置removeIndex,然後突破i/j的其餘部分(提前退出)。 – Peter

+0

嗯。在這種情況下,向量'=='很奇怪。你的意思是整行必須在數值上相等嗎?然後用'all(somerow == someotherrow)'明確這個。還要關注與浮點表示相關的四捨五入問題。考慮一些具有閾值的距離度量。 – Peter

回答

2

由於Matlab具有認爲,在命令行上一切都是雙打的陣列,並假設您的陣列和電池陣列的內容是數字的趨勢,可以取代

  if extendedPoly(k,:)==subPoly{i}(j,:) 
      removeIndex(k,1)=1; 
     end 

與其相當

removeIndex(k,1) = extendedPoly(k,:)==subPoly{i}(j,:) 

這可能會節省幾納秒,但如果它節省更多,我會有點驚訝。

我懷疑,如果我是一個有點小聰明或者更勤奮我大概可以沿的

removeIndex = extendedPoly==subPoly 

訣竅這裏的線路分配一次替換整個循環嵌套,以確保所有的陣列中該表達式具有相同的尺寸。

+0

'removeIndex(k,1)= 1;',但是你寫了什麼複製了extendedPoly和subpoly的值,無論它們在哪裏都是相等的。除此之外,我希望它是1。 – Vikram

1

您可能正在接近當前嵌套策略中的性能限制。 「慢」行只需要每次執行1次使用。

通常在像這樣的集合匹配情況下,最好是對兩個集合進行排序,然後同時通過兩個集合執行單個循環。 (谷歌「插入排序」更多關於此,也看到這個相關的問題/答案Optimization of timestamp filter in MATLAB - Working with very large datasets

如何最好地將這個應用到你的情況並不明顯。如果你發佈一個可執行的例子,我們可以更仔細地研究這一點。

不看可執行代碼,將矢量的subPoly單元展開爲單個排序的數值數組(稱爲類似sortedElementsToremove)可能是有意義的。然後從extendedPoly得到這樣的排序順序:[~, ixsSortExpended] = sort(extendedPoly);

現在您可以使用帶有兩個索引的單個循環來執行屏蔽。像這樣的東西(代碼未測試):

ixExtended = 1; %Index though sort order 
for ixSub = 1:length(sortedElementsToremove); 
    %Use while to update second index 
    while ... 
      (extendedPoly(ixsSortExpended(ixExtended)) < sortedElementsToremove(ixSub)) && ... 
      ixExtended < length(ixsSortExpended) 
     ixExtended = ixExtended + 1; 
    end 
    if (sortedElementsToremove(ixSub) == extendedPoly(ixsSortExpended(ixExtended))) 
     removeIndex(ixsSortExpended(ixExtended)) = true; 
    end 
end