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 
4

2 回答 2

2

由于Matlab倾向于认为命令行上的所有内容都是双精度数组,并且假设您的数组和单元格数组的内容是数字,您可以替换

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

与等价的

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

这可能会节省几纳秒,但如果节省更多,我会有点惊讶。

我怀疑如果我更聪明或更勤奋,我可能会用一个单一的赋值来替换你的整个循环嵌套

removeIndex = extendedPoly==subPoly

这里的技巧是确保表达式中的所有数组都具有相同的维度。

于 2012-10-22T15:30:26.080 回答
1

您可能正在接近当前嵌套策略的性能限制。“慢”行每次执行只需要 1 微秒。

通常在这样的集合匹配情况下,最好对两个集合进行排序,然后同时对两个集合执行一个循环。(谷歌“插入排序”了解更多信息,另请参阅此相关问题/答案优化 MATLAB 中的时间戳过滤器 - 使用非常大的数据集

如何最好地将其应用于您的情况并不是很明显。如果您发布一个可执行示例,我们可以更仔细地研究一下。

在不查看可执行代码的情况下,将向量的 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
于 2012-10-22T18:03:46.877 回答