我对nanoflann的search_radius
函数中的参数radiusSearch
有疑问。我的代码是这样的:
#include <iostream>
#include <vector>
#include <map>
#include "nanoflann.hpp"
#include "Eigen/Dense"
int main()
{
Eigen::MatrixXf mat(7, 2);
mat(0,0) = 0.0; mat(0,1) = 0.0;
mat(1,0) = 0.1; mat(1,1) = 0.0;
mat(2,0) = -0.1; mat(2,1) = 0.0;
mat(3,0) = 0.2; mat(3,1) = 0.0;
mat(4,0) = -0.2; mat(4,1) = 0.0;
mat(5,0) = 0.5; mat(5,1) = 0.0;
mat(6,0) = -0.5; mat(6,1) = 0.0;
std::vector<float> query_pt(2);
query_pt[0] = 0.0;
query_pt[1] = 0.0;
typedef nanoflann::KDTreeEigenMatrixAdaptor<Eigen::MatrixXf> KDTree;
KDTree index(2, mat, 10);
index.index->buildIndex();
{ // Find nearest neighbors in radius
const float search_radius = 0.1f;
std::vector<std::pair<size_t, float> > matches;
nanoflann::SearchParams params;
const size_t nMatches = index.index->radiusSearch(&query_pt[0], search_radius, matches, params);
std::cout << "RadiusSearch(): radius = " << search_radius << " -> "
<< nMatches << " matches" << std::endl;
for(size_t i = 0; i < nMatches; i++)
std::cout << "Idx[" << i << "] = " << matches[i].first
<< " dist[" << i << "] = " << matches[i].second << std::endl;
std::cout << std::endl;
}
}
我想要的是在半径 0.1 之内,所以,我所期望的是矩阵中的前三个元素,但令我惊讶的是它返回了前5个元素。检查距离返回在我看来它不是实际距离而是距离平方(右?)所以我将半径平方以得到我所期望的但不幸的是它只返回第一个点。
所以我将半径从 0.1 ^ 2 = 0.01 增加到 0.02 ,最后得到了我想要的点数。
现在,问题是,不应该包括在邻里周边的点吗?我在哪里可以改变nanoflann中的这种情况?
答案 0 :(得分:5)
KDTreeEigenMatrixAdaptor
starts like this的完整定义:
template <class MatrixType, int DIM = -1,
class Distance = nanoflann::metric_L2,
typename IndexType = size_t>
struct KDTreeEigenMatrixAdaptor
{
//...
所以,是的:默认指标是欧几里德距离的平方,L2_Adaptor
结构,and documented as follows:
平方欧几里德距离函子(通用版,针对高维数据集进行了优化)。
至于第二个问题,有两个方面。首先,当谈到浮点数时,你不应该依赖于平等(强制性引用:David Goldberg, What every computer scientist should know about floating-point arithmetic, ACM Computing Surveys, 1991)。
其次,原则上,你是对的。 nanoflann基于FLANN,您可以在其源代码中找到CountRadiusResultSet
类的实现,radiusSearch
搜索方法使用该类。其关键方法有以下实现:
void addPoint(DistanceType dist, size_t index)
{
if (dist<radius) {
count++;
}
}
虽然这个问题的共同定义似乎涉及&#34;小于或等于&#34;,例如在以下参考文献(Matthew T. Dickerson, David Eppstein, Algorithms for Proximity Problems in Higher Dimensions, Computational Geometry, 1996)中:
问题1。 (固定半径近邻搜索)给定R d 中n个不同点的有限集合S和距离。对于每个点,p∈S报告所有点对(p,q),q∈S,使得从p到q的距离小于或等于。
(我最后的重点)
然而,在数学和计算机科学中,浮点运算问题有效地抑制了对严格的平等思考。
这里你唯一的选择似乎是略微增加半径,因为CountRadiusResultSet
类的用法在FLANN内的radiusSearch
方法实现中是硬编码的。