1

x、y、z (これらは数値) の 3 つの列で構成されるデータ ファイルがあります。私は次のことをしたいと思います:

  1. データ内の各 (x, y) セットを比較します。
  2. 2 つのセットが等しい場合、たとえば (x1, y1) = (x2, y2)、
  3. 次に、z1 と z2 を比較します。比較に応じて、条件を書き、セットの 1 つを上書きして、作成したいくつかの条件に合格するセットの値を取るようにします。

データには数千のポイントが含まれているため、比較を効果的に行う方法と、その条件を満たさないポイントを上書きまたは省略する方法がわかりません。

誰かが何かを提案したり、(x1、y1、z1) と (x2、y2、z2) の 2 つの点しかない場合の小さな例を教えてください。

4

2 に答える 2

2

すべてのポイントを他のすべてのポイントと比較したいので、次のようなアルゴリズムを実行できます。次のようなデータ構造を想定します。

struct Data {
    double x_, y_, z_;
    bool skip;
    const std::pair<double, double> & xy () const {
        return std::pair<double, double>(x, y);
    }
};

std::vector<Data> file;
typedef std::multimap<std::pair<double, double>, unsigned> PointMap;
PointMap xyline;

次に、ファイルを読み込むときに、を検索しxylineて、現在のポイントが既に存在するかどうかを確認します。その場合は、それに応じて現在のポイントとベクトルを更新しfileます (一致するすべてのポイントの行番号がわかっているため、すべての一致または最新の一致のみを選択して変更できます)。次に、現在の行に関連付けられている現在のポイントを挿入し、ファイルの次の行まで繰り返します。

ファイルが処理された後、 の内容を書き出しますfile。次に、必要に応じて、出力を使用して既存のファイルを置き換えることができます。

void update (PointMap::iterator first, PointMap::iterator last, Data &d) {
    //... revisit all matching points and decide which to keep
}

Data d;
std::ifstream ifile;
std::ofstream ofile;
ifile.open("input.dat");
while (ifile >> d.x_ >> d.y_ >> d.z_) {
    PointMap::iterator i = xyline.find(d.xy());
    if (i != xyline.end()) {
        update(i, xyline.upper_bound(d.xy(), d);
    }
    xyline.insert(i, std::pair<d.xy(), file.size());
    file.push_back(d);
}

ofile.open("output.dat");
for (size_t i = 0; i < file.size(); ++i) {
    d = file[i];
    if (!d.skip)
        ofile << d.x_ << " " << d.y_ << " " << d.z_ << "\n";
}
于 2012-07-17T13:56:19.377 に答える
0
typedef std::map<float, float> Leafs;
typedef std::map<float, Leafs> Node;

Node root;

この方法でツリーにデータを入力します: (a,b,c) を追加するとします。

Leafs l;
l[ b ] = c;
root[ a ] = l;

次に、新しい値を追加するときにfind (std::map::find メソッドの説明を確認) メソッドを使用して、値が存在するかどうかを確認します。これは、この「問題」の十分に速い解決策になるはずです

于 2012-07-17T13:25:30.523 に答える