6

私は数千行のコードを含む大きな Matlab テストベンチに取り組んでおり、Matlab のプロファイラーで決定された、最も時間のかかるルーチンを最適化しようとしています。最も時間のかかる操作の 1 つが次の操作であることに気付きました。

list = list((list(:,1) >= condxMin) & (list(:,1) <= condxMax) & (list(:,2) >= condyMin) & (list(:,2) <= condyMax),:);

具体的には、座標の大きなリスト (少なくとも 50000 x 2) があり、このリストの値を制限して、これらの条件の両方を検証するポイントのみを保持したいと考えています: list(:,1) must be within [ condxMin, condxMax] と [condyMin condyMax] 内の list(:2)。

このコード行は既にベクトル化されていることを考えると、もっと効率的な方法はないかと考えていました。また、Matlab が短絡を行っているかどうかも疑問です。そうでない場合は、ベクトル化を中断せずに while ループを使用して実行する方法はないと思います。代わりに、次のように記述します。

j=1;
for i=1:size(list,1)
   if(cond1 && cond2 && cond3 && cond4)
      newlist(j,1:2) = list(i,1:2);
      j=j+1;
   end
end

あなたの答えを前もってありがとう:)

4

1 に答える 1

1

元のベクトル化されたバージョンは、本当に賢いアイデアがなければ、私が見つけることができる最速の方法のようです。Matlab は短絡を行いますが、マトリックスは行いません。あなたが示したループの実装は、事前に割り当てていないため(また、完全な行列を事前に割り当てることもできないため)、非常に遅くなります。

これには、短絡した && を使用してインデックスが悪いかどうかを判断する for ループなど、いくつかのバリエーションを試しましたが、そのような運はありませんでした。プラス面として、得られたベクトル化されたバージョンは、500 万要素の座標リストに対して 0.21 秒で実行されます。

于 2012-08-31T12:24:10.013 に答える