Ich versuche, den Punkt zu finden, der in einem minimalen Abstand von der Kandidatenmenge ist. Z ist eine Matrix, in der die Zeilen die Dimension und Spalten die Punkte darstellen. Berechnen der Zwischenpunktabstände und dann Aufnehmen des Punktes mit minimalem Abstand und dessen Entfernung. Unten ist das Code-Snippet. Der Code funktioniert gut für eine kleine Dimension und eine kleine Menge von Punkten. Es dauert jedoch lange Zeit für große Datenmengen (N = 1 Million Datenpunkte und Dimension ist ebenfalls hoch). Gibt es einen effizienten Weg?Matlab: Hilfe bei der Suche nach Mindestabstand
Antwort
Ich schlage vor, dass Sie pdist
verwenden, um das schwere Heben für Sie zu tun. Diese Funktion berechnet die paarweise Entfernung zwischen zwei Punkten in Ihrem Array. Der resultierende Vektor ist zu Matrixform setzte in squareform
, um mit dem Minimalwert für jedes Paar zu finden:
N = 100;
Z = rand(2,N); % each column is a 2-dimensional point
% pdist assumes that the second index corresponds to dimensions
% so we need to transpose inside pdist()
distmatrix = squareform(pdist(Z.','euclidean')); % output is [N, N] in size
% set diagonal values to infinity to avoid getting 0 self-distance as minimum
distmatrix = distmatrix + diag(inf(1,size(distmatrix,1)));
mindists = min(distmatrix,[],2); % find the minimum for each row
sum_dist = sum(mindists); % sum of minimal distance between each pair of points
Dieser berechnet jedes Paar zweimal, aber ich denke, das für Ihre ursprüngliche Implementierung wahr ist.
Die Idee ist, dass pdist
den paarweisen Abstand zwischen den Spalten seiner Eingabe berechnet. Also setzen wir die Transponierte von Z
in pdist
. Da die volle Ausgabe immer eine quadratische Matrix mit Nulldiagonale ist, wird pdist
so implementiert, dass sie nur die Werte über der Diagonalen in einem Vektor zurückgibt. Daher wird ein Aufruf an squareform
benötigt, um die richtige Abstandsmatrix zu erhalten. Dann muss das zeilenweise Minimum dieser Matrix gefunden werden, aber zuerst müssen wir die Null in den Diagonalen ausschließen. Ich war faul, also setze ich inf
in die Diagonalen, um sicherzustellen, dass das Minimum woanders ist. Am Ende müssen wir nur die minimalen Entfernungen zusammenfassen.
@SrishtiM obwohl es klingt interessant, leider weiß ich nichts über das Thema, also kann ich dir nicht helfen :) –
- 1. Matlab Hilfe bei der Suche nach Dimensionen
- 2. Suche nach Mindestabstand zwischen zwei Punkten
- 3. MonoDevelop 2.4: Hilfe bei der Suche nach einer DLL
- 4. Suche nach VB6 Online-Hilfe
- 5. unerwartete EOF bei der Suche nach passenden `) '
- 6. Eclipse stürzt bei der Suche nach Datei
- 7. Regex Probleme bei der Suche nach Leerzeichen
- 8. Greasemonkey bei der Suche nach Text Problem
- 9. Java Script, muss meinen Fehler Hilfe bei der Suche
- 10. Hilfe bei der Suche CSS Problem in FireFox
- 11. Suche nach Hilfe mit Python-Konsole
- 12. MySQL COUNT ??? Hilfe für die Suche nach
- 13. Auf der Suche nach einer Open-Source-Java-Hilfe-API
- 14. Auf der Suche nach Hilfe überschreiben die Schriftfarbe meines Themas
- 15. Wie finden Sie Opensource-Projekte auf der Suche nach Hilfe?
- 16. Ich brauche Hilfe bei der Suche nach kleinen Fehlern in meinem Python-Code
- 17. brauche Hilfe bei der Suche nach umfassenden Netbeans Plugin Entwicklung Tutorials
- 18. Mindestabstand Funktion zwischen Strings
- 19. SQLite-Abfrage - Hilfe bei der Volltextsuche
- 20. brauche Hilfe bei der Datenbankverbindung
- 21. MSBuild-Fehler bei der Suche nach der nuget.targets-Datei
- 22. BASH unerwartetes EOF bei der Suche nach passenden ``‘
- 23. Neo4j - Bewertung basierend auf Eignung bei der Suche nach Benutzern
- 24. Fehler bei der Verwendung von horzcat - textscan - Import nach Matlab
- 25. brauche Hilfe bei der Datenbankerstellung
- 26. Hilfe bei der relativen Positionierung
- 27. Hilfe bei der Suchmaschinenarchitektur .NET C#
- 28. der Suche nach FEHLT Aufzeichnungen
- 29. Regex Suche Hilfe
- 30. brauche Hilfe bei der Umstrukturierung einer Abfrage
Wenn Sie genügend Speicher und die erforderliche Toolbox haben, werfen Sie einen Blick auf ['pdist'] (http://www.mathworks.com/help/stats/pdist.html). –
Wenn ich mir die Dokumentation anschaue, mit der ich verlinkt bin, scheint die Ausgabe von 'pdist' eine '[N, N-1]' -große Matrix zu sein: die Entfernung jedes Punktes in Bezug auf jeden anderen Punkt. Sie müssen nur das Minimum dieser Matrix für jede Zeile finden. Mit anderen Worten, 'min (pdist (Z,' euklidisch '), [], 2)' sollte die minimale nächste Nachbardistanz für jeden Punkt sein, und 'sum()' dies gibt Ihnen, was Sie brauchen. Natürlich müssen Sie dies auf Ihre korrekte Implementierung überprüfen, aber es sollte sehr einfach sein. –
Es ist ein Vektor, weil Sie den letzten Teil meines Kommentars verpasst haben: Sie müssen 'sum()' auf diesem Vektor verwenden, um es zusammenzufassen ..... –