现在的问题是, 我有一堆数据是四维的, 但是查询时只需要用到前三维, 那么该怎么做呢?
有两种方法:
1) 用L2_3D
#include <flann/flann.hpp>
#include <iostream>
#include <iomanip>
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<float> dataset(data, 4, 4);
flann::KDTreeSingleIndex< flann::L2_3D<float>> index(dataset, flann::KDTreeIndexParams(8));
index.buildIndex();
float queryData[4] = {0,0,0,0};
flann::Matrix<float> query(queryData, 1, 4);
flann::Matrix<int> matIndices(new int[1*3], 1, 3);//one query, return 3 nearest neighbors.
flann::Matrix<float> 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 <flann/flann.hpp>
#include <iostream>
#include <iomanip>
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<float> dataset(data, 4, 3, 4 * sizeof(float));
flann::KDTreeSingleIndex< flann::L2<float>> index(dataset, flann::KDTreeIndexParams(8));
index.buildIndex();
float queryData[4] = {0,0,0};
flann::Matrix<float> query(queryData, 1, 3);
flann::Matrix<int> matIndices(new int[1*3], 1, 3);//one query, return 3 nearest neighbors.
flann::Matrix<float> 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维.