【发布时间】:2016-03-11 23:24:12
【问题描述】:
我有一套积分cloub(积分cloub的数量≈200万)。我想为点 cloub 中的每个点找到最近的 k 邻居。我做了这样的事情
flann::Index flann_index(data_m, flann::KDTreeIndexParams(),cvflann::FLANN_DIST_EUCLIDEAN);// create the object of flann
for (int i = 0; i < numberOfPointsInPointCloub; i++){
flann_index.knnSearch(data_m.row(i), indices, dists,num_of_knn); //each row is a new set of point in 3D
..//save the results "dist" and "indices" in somewhere else
}
但这运行速度很慢。在 for 循环中,它在 20 秒内运行 1000 次,非常慢。我用错了吗?或者有什么方法可以加快速度?
更新: 我需要搜索的查询点正是用于构建树的点,我需要为树中的每个点找到最近的 k 个邻居,因此我从数据的每一行中获取点并执行 knnSearch。
【问题讨论】:
-
k-NN 算法可能会遭受所谓的“维度诅咒”,并且可能具有 O(kN^(1 -1/k))。如果您的点云实际上是随机的,那么您可能无法加快搜索速度。当您遍历大约 200 万个点中的每一个,然后执行 knnSearch 时,您正在创建一个将在超线性时间内运行的嵌套循环。如果不查看所有代码,很难确定可以进行哪些优化来加速您的代码。