wie finden Sie k-TEN nächsten Nachbarn eines Punktes in eine Reihe von Punkt
Habe ich eine Reihe von Punkt (x,y) auf der 2d-Ebene. Gegeben ein Punkt (x0,y0), und die Zahl k, so finden Sie den k-TEN nächsten Nachbarn von (x0,x0) im Punkt gesetzt. Im detail, den Punkt zu setzen sind vertreten durch zwei Arrays: x und y. Der Punkt (x0,y0) ist gegeben durch den index i0. Es bedeutet, x0=x(i0) und y0=y(i0).
Gibt es eine Funktion oder etwas in Matlab hilft mir dieses problem. Wenn Matlab nicht haben diese Art von Funktion, können Sie schlagen jede andere wirksame Möglichkeiten.
BEARBEITEN: ich habe zur Berechnung dieser Art von Entfernung für jeden Punkt (x0,y0) im set. Die Größe des sets ist etwa 1000. Der Wert von k sollte etwa sqrt(1500). Das Schlimmste ist, dass ich dies viele Male. Bei jeder iteration werden die änderungen an, und ich berechne die Entfernungen wieder. So, die Laufzeit ist auf ein kritisches problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
wenn Sie dies tun, überprüfen Sie für viele Punkte möchten Sie vielleicht, um zu konstruieren, ein inter-Punkt-Abstand-Tabelle
knnsearch
, ist in der Regel viel schneller, wenn man O(N lg^2 N) zu konstruieren, O(lg N) für 1-nearest neighbour, und, ich vermute, um O(k(lg k)(lg N)) für k-nächsten Nachbarn, wenn k klein ist und mit einem günstigen dataset (denken: über binäre Suche). (Das bedeutet zum Beispiel, dass wenn Sie über 10000 Punkte, es sollte irgendwo um 100-bis 1000-mal schneller.) Daher knnsearch ist viel lieber,.Wenn Sie über die Statistik toolbox, die Sie verwenden können, die Funktion knnsearch.
Einen brute-force-Algorithmus wäre so etwas wie dieses:
Die freie und opensource VLFeat toolbox enthält ein kd-Baum Implementierung, unter andere nützliche Dinge.
Den brute-force-Ansatz sieht wie folgt aus: