45 ifstream ifs(fileName);
56 ifs.getline(line,
sizeof(line));
57 line[
sizeof(line)-1] = 0;
59 char *token = strtok(line,
" \t,;");
64 data.push_back(atof(token));
66 token = strtok(NULL,
" \t,;");
71 return Matrix::Map(&data[0], dim, data.size() / dim);
77 if (coord.size() == 2)
79 <<
"<circle cx=\"" << zoom*coord(0)
80 <<
"\" cy=\"" << zoom*coord(1)
81 <<
"\" r=\"" << ptSize
82 <<
"\" stroke-width=\"" << 0.2 * ptSize
83 <<
"\" " << style <<
"/>" << endl;
88 int main(
int argc,
char* argv[])
95 typedef Nabo::KDTree<float> KDTF;
99 cerr <<
"Usage " << argv[0] <<
" DATA" << endl;
103 Matrix d(load<float>(argv[1]));
111 const int itCount(100);
112 for (
int i = 0; i < itCount; ++i)
117 Vector
q(d.col(rand() % d.cols()));
120 Indexes indexes_bf(bfs.
knn(q, K,
false));
122 Indexes indexes_kdtree(kdt.knn(q, K,
false));
124 if (ndexes_bf.size() != indexes_kdtree.size())
126 assert(indexes_bf.size() == indexes_kdtree.size());
127 assert(indexes_bf.size() == K);
129 for (
size_t j = 0; j < K; ++j)
131 Vector pbf(d.col(indexes_bf[j]));
132 Vector pkdtree(d.col(indexes_kdtree[j]));
135 assert(indexes_bf[j] == indexes_kdtree[j]);
136 assert(
dist2(pbf, pkdtree) < numeric_limits<float>::epsilon());
139 cerr <<
"stats kdtree: " 140 << kdt.getStatistics().totalVisitCount <<
" on " 141 << itCount * d.cols() <<
" (" 142 << double(100 * kdt.getStatistics().totalVisitCount) /
double(itCount * d.cols()) <<
" %" Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > Matrix
a column-major Eigen matrix in which each column is a point; this matrix has dim rows ...
NearestNeighbourSearch< T >::Matrix load(const char *fileName)
int main(int argc, char *argv[])
Nearest neighbour search interface, templatized on scalar type.
Eigen::Matrix< T, Eigen::Dynamic, 1 > Vector
an Eigen vector of type T, to hold the coordinates of a point
int Index
an index to a Vector or a Matrix, for refering to data points
Brute-force nearest neighbour.
void dumpCoordinateForSVG(const typename NearestNeighbourSearch< T >::Vector coord, const float zoom=1, const float ptSize=1, const char *style="stroke=\lack\fill=\ed\)
virtual unsigned long knn(const Matrix &query, IndexMatrix &indices, Matrix &dists2, const Index k, const T epsilon, const unsigned optionFlags, const T maxRadius) const
T dist2(const A &v0, const B &v1)
Euclidean distance.
Nabo::BruteForceSearch< float > BFSF