我對nanoflann的radiusSearch
函數中的參數search_radius
有疑問。我的代碼是這樣的:Nanoflann半徑搜索
#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中更改這種情況?
好的感謝一個非常完整的描述。我肯定必須閱讀那篇關於浮點運算的論文。還有一個問題,不是L2_Norm定義爲sqrt(點(v,v))...我想他們只是在納米平面上保持點(v,v),是嗎? – BRabbit27 2014-09-30 11:28:58
@ BRabbit27是的,名稱是誤導性的。 – BartoszKP 2014-09-30 12:55:59