Mam zestaw danych obejmujący miliony punktów danych w 3D. Aby wykonać obliczenia, muszę obliczyć sąsiada (wyszukiwanie zakresu) dla każdego punktu danych w promieniu, spróbować dopasować funkcję, obliczyć błąd dopasowania, powtórzyć to dla następnego punktu danych i tak dalej. Mój kod działa poprawnie, ale jego uruchomienie zajmuje bardzo dużo czasu, około 1 sekundy na punkt danych! Jest tak prawdopodobnie dlatego, że dla każdego punktu musi przeszukiwać cały zestaw danych. Czy istnieje sposób na szybkie przyspieszenie procesu? Mam pomysł, że jeśli uda mi się w jakiś sposób ustalić relację sąsiedztwa między pierwszymi sąsiadami, może to być mniej powolne. Jeśli to pomaga, staram się znaleźć optymalną szerokość okna Parzen w 3D.
źródło
Zdecydowanie powinieneś sprawdzić drzewa i oktawy KD, które są metodami wyboru dla zestawów punktów (podczas gdy BSP są dla obiektów ogólnych, a siatki dla mniej lub bardziej jednolitych gęstości). Mogą być bardzo kompaktowe i szybkie, minimalizując obciążenie zarówno pamięci, jak i obliczeń, i są łatwe do wdrożenia.
Kiedy punkty są mniej więcej równomiernie rozmieszczone (nawet z pustymi obszarami, ale nie może występować osobliwość gęstości lub inna wysoka koncentracja), sprawdź wypełnienia kul, jeśli chcesz wypróbować podobną do siatki niehierarchiczną podział przestrzeni.
źródło
Prawdopodobnie powinieneś rozważyć budowę triangulacji Delaunaya (no cóż, jej analogu 3D). W 2D jest to specjalna triangulacja punktów danych, która zawsze zawiera najbliższego sąsiada. To samo dotyczy 3D, ale z czworościanami.
Możesz zbudować raz na zawsze triangulację, a następnie wyszukać najbliższego sąsiada bezpośrednio w triangulacji. Myślę, że istnieją pewne dobre algorytmy do zbudowania triangulacji: w 2D, konstrukcja triangulacji jest wn log( n ) a późniejsze wyszukiwanie najbliższego sąsiada jest liniowe pod względem liczby punktów danych.
Mam nadzieję, że to pomoże!
źródło