У меня есть набор точек cloub (количество точек cloub≈2million). Я хотел бы найти ближайшего k-соседа для каждой точки в точке cloub. Я сделал что-то вроде этогоFLANN в opencv работает слишком медленно
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 он работает 1000 раз в течение 20 секунд, что очень медленно. Я использую это неправильно? Или есть какой-нибудь метод, чтобы я мог его ускорить?
Обновление: Точка запроса, которую мне нужно найти, - это точно точка, используемая для построения дерева. Мне нужно найти ближайший соседний k для каждой точки в дереве, таким образом, я беру точку из каждой строки данные и выполнить knnSearch.
Алгоритмы k-NN могут страдать от так называемого «проклятия размерности» и могут иметь худшую временную границу * O (kN^(1-1/k)) *. Если ваше облако точек является практически случайным, может быть не так много, чтобы ускорить поиск. Когда вы проходите каждый из 2 миллионов точек или около того, а затем выполняете knnSearch, вы создаете вложенный цикл, который будет работать в суперлинейном времени. Не видя всего кода, сложно определить, какие оптимизации можно сделать для ускорения вашего кода. – callyalater