Überprüfung von Punkten auf Orthogonalität und Parallelit
Neuling0421
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.06.2017, 09:36
Titel: Überprüfung von Punkten auf Orthogonalität und Parallelit
Hallo Leute,
ich weiß nicht ob dieses Problem schon diskutiert wurden ist - bestimmt wurde es das -
aber leider konnte ich nichts passendes dazu finden.
Problemstellung:
Ich habe eine Matrix (nx2) mit n>=3 und möchte in dieser Matrix prüfen, ob ein Punkt senkrecht oder parallel zu seinem Nachbarpunkt ist. Fall nicht soll dieser Punkt - Zeile - aus der Matrix gelöscht werden. Ich habe mir schon einige Gedanken dazu gemacht und wollte diese mit einer dynamischen Variable lösen, was ich nach ein paar gelesenen Forenbeiträgen hier schnell verworfen habe. Hier mal eine kleine Übersicht der Struktur, die ich bis jetzt habe
Code:
%Das ist mein Programm.
A=rand(10^5,2);
B=zeros(size(A,1));
Ich hoffe, die Idee und das Problem sind ein weinig klar geworden. Falls irgendwelche Fragen sein sollten, dann werde ich versuchen diese so gut wie möglich zu beantworten.
Hierbei gibt es aber ein Problem: Da die Zahlen nur mit begrenzter Genauigkeit gespeichert werden, sind auf die Punkt- und Kreuz-Produkte mit rundungsfehlern behaftet. Diese treten gerade in der Nähe von 0 besonders stark auf. Deshalb wäre die
atan2
Methode genauer:
Dann müsstest Du die Winkel überprüfen und ein Genauigkeits-Limit setzen: <= 1e-8 z.B., jenachdem, was Du genau als "parallel oder senkrecht" akzeptieren möchtest.
Gruß, Jan
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.06.2017, 15:58
Titel:
Hallo Jan S. Danke für die schnelle Antwort. Vielleicht sollte ich den Code besser erklären. Was die 10^5 betrifft, so steht diese lediglich für die Dimensionen in den den sich die Punktemenge bzw. Vektoren befinden werden, die ich überprüfen möchte. Was deine Methode mit der Bestimmung der Winkel betrifft, so war dies meine erste Idee, die ich dann aber durch
Der Grund warum ich alle Punkte/Vektoren überprüfe ist der, da ich lediglich nur die Punkte/Vektoren behalten möchte die auch wirklich parallel oder orthogonal zueinander sind aufgrund des löschen derjeniger Vektoren, die es gerade nicht sind.
Ein einfaches Beispiel: Gegeben sind die Vektoren v1, v2, v3. Überprüfe ob v1 para. oder ortho. zu v2 ist wenn nicht löschen. Nun überprüfe ob v1 para oder ortho zu v3 ist, da v3 neuer Nachbarpunkt von v3 ist usw.
Ich hoffe die Aufgabenstellung ist jetzt klarer. Was die Genauigkeit im Nullpunkt betrifft, so hatte ich vor diese wie beim Tikhonov-Funktional zu umgehen.
Der Kommentar zu "10^5" war ganz allgemein. Hier betrifft es ja nur eine Zeile, da wird die Beschleunigung nicht messbar sein. Aber wenn z.B. in eier ODE-Funktion viele Parameter mit der Schreibweise 5*10^6 auftauchen, kann das schon der Bottleneck eines Codes sein, während 5e6 eine kostenfreie Konstante ist.
Das ist für Deine Frage allerdings nicht relevant.
Ich verstehe die Frage immer noch nicht ganz: Wieso überprüfst Du alle Werte?
Suchst Du also eigentlich nach allen Vektoren, die zum ersten parallel oder orthogonal sind? Wenn sukksessive alle anderen gelöscht werden, wäre das ja die Konsequenz, oder? Damit wäre aber die doppelte Schleife auch unnötig.
Das Genauigkeitsproblem bleibt: Die Werte auf == 0 zu testen ist aus numerischer Sicht Unfug. Auf < 1e-10 zu testen (oder eine beliebige andere Grenze) ist tükisch, weil die beiden Funktionen genau dort numerisch instabil sind. ATAN2 ist deshalb die beste Wahl und ein Vergleich mit den 4 Winkeln.
Gruß, Jan
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 27.06.2017, 17:58
Titel:
Hallo Jan,
was deine Frage bzgl. der Prüfung der Punkte/Vektoren angeht, so hast du recht. Natürlich will ich nur die Nachbarpunkte überprüfen und deswegen ist die erste for-Schleife völlig überflüssig. Ich poste mal den Code, den ich bis jetzt habe:
Leider überprüf ich mit dem obigen Code lediglich die Vektoren nur einmal. Könntest du mir verraten, ob es einen Weg gibt, die Vektoren weiter auf Parallelität und Orthogonalität prüfen. Ich wollte das über eine while-Schleife lösen, aber irgendwie gefällt mir der Weg nicht bzw. es will nicht richtig funktionieren. Gibt es einen eleganteren Weg?
Brauchst Du wirklich eine Schleife?
Du fängst mit dem ersten Vektor an. Alle, die nun folgen, werden entfernt, wenn sie zum ersten nicht orthogonal oder parallel sind. Daraus folgt aber, dass sie auch untereinander aller orthogonal oder parallel sein müssen, zumindest im 2D Fall. Oder übersehe ich da etwas?
Also eigentlich müsste es reichen, den Winkel gegenüber dem ersten Vektor zu berechnen und alle Vektoren zu akzpetieren, die in 0, 90, 180, 270 Grad dazu stehen.
Eigentlich sind die 3 Zeilen aus meiner Antwort 24.06.2017, 15:45 also schon genug, oder nicht?
Das erzeugt eine 10e5 x 10e5 Matrix. Ist das gewollt?
Gruß, Jan
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.06.2017, 19:41
Titel:
Guten Abend Jan,
was die Matrix betrifft, so ist das nicht gewollt. Stattdessen sollte dort ein 10e5x1 Vektor stehen. Was die Kontrolle bzgl. Orthogonalität und Parallelität angeht, so habe ich ein Beispiel, wo deine Behauptung nicht stimmt und zwar:
Das ist ein bedeutender Unterschied, denn in 2D gibt es eben keinen Freiheitsgrad, um den man rotieren kann.
Bitte erkläre genau, welche Dimension Deine Inputs haben. Denn falls es um mehr als 2 geht, hätte ich mir alle bisherigen Vorschläge gespart.
Viele Grüße, Jan
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 29.06.2017, 06:59
Titel:
Was die Daten betrifft, da sollen diese sowohl aus dem R^2 als auch aus dem R^3 sein. Ich wollte zunächst den 2-dim Fall diskutieren, den ich dann auf den 3-dim Fall erweitern wollte. Hoffe, es ist jetzt alles soweit geklärt. Und sorry für die ganzen Ungereimtheiten.
prüfen, ob ein Punkt senkrecht oder parallel zu seinem Nachbarpunkt ist. Fall nicht soll dieser Punkt - Zeile - aus der Matrix gelöscht werden.
Welcher Punkt der beiden Punkte soll gelöscht werden?
Gruß, Jan
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 29.06.2017, 10:04
Titel:
Es soll der zweite Punkt/Vektor gelöscht werden.
Gruß
Neuling0421
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.