使用FLANN

时间:2016-10-30 18:48:54

标签: c++ nearest-neighbor flann exact-match approximate-nn-searching

我试图找到一个大的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);

2 个答案:

答案 0 :(得分:1)

尝试nanoflann。它是专为低维空间设计的,并提供了 exact 最接近的邻居。此外,它只是一个头文件,您可以“安装”或直接复制到您的项目中。

答案 1 :(得分:0)

您应该检查flann-manual中的第6页以上的内容,以微调您的搜索参数,例如target_precision,这应该设置为1,以获得“最大”的准确度。

该参数通常在近似最近邻搜索(ANNS)中被发现为epsilon(ε),用于高维空间,以便(尝试)击败维数的诅咒。据我所知,FLANN通常用于128个维度而不是3个维度,这可以解释您遇到的糟糕表现。

在3维中运行良好的库是CGAL。但是,它比FLANN大得多,因为它是一个用于计算几何的库,因此它为许多问题提供了功能,而不仅仅是NNS。