1

大きな 3D ポイント データセット内の隣接ノードの正確な数を見つけようとしています。目標は、データセットの各ポイントが、指定された半径の領域内のすべての可能な近隣を取得することです。FLANNは、ブルートフォース検索と比較して、より低い次元のデータが正確な隣人を取得できることを保証しますが、そうではないようです。隣人はさらなる計算に不可欠であるため、正確な数が必要です。半径を少し大きくしてテストしましたが、これが問題ではないようです。FLANNまたは他のC++ライブラリを使用して正確な隣人を計算する方法を知っている人はいますか?

コード:

// All nodes to be tested for inclusion in support domain.
flann::Matrix<double> query_nodes = flann::Matrix<double>(&nodes_pos[0].x, nodes_pos.size(), 3);

// Set default search parameters
flann::SearchParams search_parameters = flann::SearchParams();
search_parameters.checks = -1;
search_parameters.sorted = false;
search_parameters.use_heap = flann::FLANN_True;

flann::KDTreeSingleIndexParams index_parameters = flann::KDTreeSingleIndexParams();
flann::KDTreeSingleIndex<flann::L2_3D<double> > index(query_nodes, index_parameters);
index.buildIndex();

//FLANN uses L2 for radius search.
double l2_radius = (this->support_layer_*grid.spacing)*(this->support_layer_*grid.spacing);
double extension = l2_radius/10.;
l2_radius+= extension;

index.radiusSearch(query_nodes, indices, dists, l2_radius, search_parameters);
4

2 に答える 2

0

flann-manualの 6 ページ以降を確認してtarget_precision、「最大」の精度を得るために 1 に設定する必要があるなどの検索パラメータを微調整する必要があります。

そのパラメータは、次元の呪いを打破しようとする (試みる) ために、高次元空間で使用される近似最近傍探索 (ANNS) でイプシロン (ε) としてよく見られます。私が知る限り、FLANN は通常 3 次元ではなく 128 次元で使用されます。

3 次元でうまく機能するCGALです。ただし、FLANN は計算幾何学のライブラリであるため、FLANN よりもはるかに大きく、NNS だけでなく多くの問題に対応する機能を提供します。

于 2016-10-31T14:42:46.070 に答える