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 は、コマンド ラインのすべてが double の配列であると考える傾向があるため、配列とセル配列の内容が数値であると仮定すると、次のように置き換えることができます。

         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 usec しか必要としません。

一般に、このようなセット マッチングの場合は、両方のセットを並べ替えてから、両方のセットを同時に 1 回ループする方がよいでしょう。(これに関する詳細については、Google の「挿入ソート」を参照してください。関連する質問/回答MATLAB でのタイムスタンプ フィルターの最適化 - 非常に大きなデータセットの操作も参照してください)

これを自分の状況に最もよく適用する方法はすぐにはわかりません。実行可能な例を投稿すると、これをより詳しく調べることができます。

実行可能コードを見ずに、ベクトルの subPoly セルを単一の並べ替えられた数値配列 ( のようなものsortedElementsToremove) に展開することは理にかなっている場合があります。次に、次のextendedPolyように並べ替え順序を取得します[~, ixsSortExpended] = sort(extendedPoly);

これで、2 つのインデックスを持つ単一のループを使用してマスキングを実行できるようになりました。このようなもの(コードはテストされていません):

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 に答える