2012-10-22 56 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