0

以前のクラスターのベクトルと現在のクラスターのベクトルがあります。クラスターには2DPoint2Fのベクトルがありますが、距離ベクトルに格納されている各クラスター間の距離に基づいてこれらのクラスターを昇順で並べ替えたいのですが、クラスターベクトルを並べ替えるより良い方法を提案できますか?

 distances.resize(previousClusters.size()*currentClusters.size());
         for (int i=0; i<previousClusters.size()*currentClusters.size(); i++)
         {
             distances[i].resize(previousClusters.size()*currentClusters.size());
         }

         for (int i=0; i< previousClusters.size(); i++)
         {

             for(int j=0; j < currentClusters.size(); j++)
             {

                 distances[i][j] = cv::norm(previousClusters[i].m_Properties.m_Center - currentClusters[j].m_Properties.m_Center );
             }
         }
4

2 に答える 2

4

注:これは、最初に書かれたとおりに(そして、まだタイトルに書かれているように)質問に答えます。質問の本文は無効になるように変更されましたが、回答はベクトルのベクトルを並べ替えるのに役立つ場合があります。

まず、あるベクトルを別のベクトルの前にソートすることの意味を決定し、コンパレーターを作成する必要があります。

struct compare_distance_vectors {
    bool operator()(std::vector<double> const & v1, std::vector<double> const & v2) {
        // implement your comparison here.
        // return "true" if v1 should come before v2.
    }
};

次に、を使用std::sortしてその順序に従って並べ替えます。

std::sort(vectors.begin(), vectors.end(), compare_distance_vectors());

辞書式順序(つまり、最初の要素による順序付け、次に等しい場合は2番目の要素による順序付けなど)が必要な場合は、デフォルトのコンパレーター(であり、比較に使用)を使用できstd::less<value_type>ます<

std::sort(vectors.begin(), vectors.end());

一般に、任意のタイプ(などstd::vector<cv::Point2f>)のシーケンスを任意の順序に従ってソートするには、そのようなコンパレータを作成して順序を指定し、std::sortそのコンパレータで使用します。

于 2012-09-04T14:41:11.030 に答える
-1

最初に「上部」ベクトルでstd::sortを使用してみて(2番目のプロトタイプでは、「下部」ベクトルのソート方法を定義できます)、次に関数オブジェクトCompが呼び出されるたびにstd:を使用します。 :各「下位」メソッドで再度ソートします(今回は最初のプロトタイプで十分です)。

これは、2番目の質問でも機能します。

于 2012-09-04T14:41:54.900 に答える