Verfasst am: 05.12.2018, 16:30
Titel: Punkte auf naheliegende Gitterpunkte verschieben
Hallo,
ich habe Punkte (x,y,z), die verteilt im Raum liegen. Nun möchte ich diese auf ein von mir vorgegebenes dreidimensionales Gitter liegen. Hier sind x-y-Koordianten in Gitter_kart (:,1) und Gitter_kart(:,2) gegeben. Die z-Koordinate ist ein seperater Vektor. Jeder Punkt soll nun auf den naheliegensten Gitterpunkt verschoben werden.
Momentan habe ich diesen Ansatz:
Jeder Punkt wird einzeln betrachtet. Zunächst erfolgt die Eingrenzung in den Quadranten (x,y). Dann das Folgende
Code:
for pp = 1:1:p % über alle Punkte im Raum, die auf Gitter verschoben werden sollen for kk = 1:1:k % über alle Gitterpunkte [~,oo] = min(abs(z-Punkt(mm,3,pp))); % Z-Koordinate wird separat ermittelt ifnorm(Punkt(mm,:,pp) - [Gitter_kart(kk,1) Gitter_kart(kk,2) z(oo)]) < d
d = norm(Punkt(mm,:,pp) - [Gitter_kart(kk,1) Gitter_kart(kk,2) z(oo)]);
Punkt_verschoben(mm,:,pp) = [Gitter_kart(kk,1) Gitter_kart(kk,2) z(oo)];
end end end
Dann verbleibt der alte Punkt und ein Gitterpunkt mit unbekannten x und y-Koordinaten, aber bekannten z.
Dann folgt eine Schleife, die den Abstand aller Gitterpunkte (x-unbekannt, y-unbekannt, z-bekannt) zum zu verschiebenden Punkt berechnet. Ist der Abstand geringer, als mit dem vorherigen Punkt, so wird der Gitterpunkt überschrieben. Schlussendlich bleibt der Gitterpunkt in "Punkt_verschoben" stehen, der den geringsten Abstand aufweist.
In der Tat funktioniert diese Vorgehensweise sehr gut.
ABER: je nach Anzahl der Punkte und Gitterpunkte dauert dies Ewigkeiten.
Wie könnte man das effizienter gestalten?
Vielen Dank für die Hilfe!
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 06.12.2018, 12:53
Titel:
Hallo,
ich stand da etwas auf der Leitung. Der deutlich schnellere Weg ist, für jeden Punkt die am nächsten gelegene Gitterkoordinate für x,y und z zu suchen. So, wie es für z eigentlich schon gemacht wurde.
Damit folgt
Code:
for pp = 1:1:p % über alle Punkte im Raum, die auf Gitter verschoben werden sollen for kk = 1:1:k % über alle Gitterpunkte [~,oo] = min(abs(z-Punkt(mm,3,pp))); % Z-Koordinate wird separat ermittelt [~,tt] = min(abs(x-Punkt(mm,1,pp)));
[~,rr] = min(abs(y-Punkt(mm,2,pp)));
Punkt_verschoben(mm,:,pp) = [x(tt) y(rr) z(oo)];
end end
läuft deutlich schneller und macht weniger Arbeit.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.