本文共 2178 字,大约阅读时间需要 7 分钟。
现在的问题是, 我有一堆数据是四维的, 但是查询时只需要用到前三维, 那么该怎么做呢?
有两种方法:
1) 用L2_3D
#include#include #include using namespace std;int main(int argc, char** argv){ float data[16] = { 1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4,}; flann::Matrix dataset(data, 4, 4); flann::KDTreeSingleIndex< flann::L2_3D > index(dataset, flann::KDTreeIndexParams(8)); index.buildIndex(); float queryData[4] = { 0,0,0,0}; flann::Matrix query(queryData, 1, 4); flann::Matrix matIndices(new int[1*3], 1, 3);//one query, return 3 nearest neighbors. flann::Matrix matDists(new float[1*3], 1, 3); const flann::SearchParams searchParams(32, 0, false); index.radiusSearch(query, matIndices, matDists, 12.1, searchParams); for (int q = 0; q < 1; q++) { for (int r = 0; r < 3; r++) { cout << matIndices[q][r] << "\t"; for (int j = 0; j < 4; ++j) { cout << dataset[matIndices[q][r]][j] << "\t"; } cout << "dist:" << matDists[q][r] << endl; } } return 0;}
2) 用dataset 中 的stride 参数
#include#include #include using namespace std;int main(int argc, char** argv){ float data[16] = { 1, 1, 1, 1, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4,}; flann::Matrix dataset(data, 4, 3, 4 * sizeof(float)); flann::KDTreeSingleIndex< flann::L2 > index(dataset, flann::KDTreeIndexParams(8)); index.buildIndex(); float queryData[4] = { 0,0,0}; flann::Matrix query(queryData, 1, 3); flann::Matrix matIndices(new int[1*3], 1, 3);//one query, return 3 nearest neighbors. flann::Matrix matDists(new float[1*3], 1, 3); const flann::SearchParams searchParams(32, 0, false); index.radiusSearch(query, matIndices, matDists, 12.1, searchParams); for (int q = 0; q < 1; q++) { for (int r = 0; r < 3; r++) { cout << matIndices[q][r] << "\t"; for (int j = 0; j < 4; ++j) { cout << dataset[matIndices[q][r]][j] << "\t"; } cout << "dist:" << matDists[q][r] << endl; } } return 0;}
两种方法的区别, 第一种查询数据的维数是4维, 第二种查询数据的维数是3维.
转载地址:http://aaxdi.baihongyu.com/