WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Überprüfung von Punkten auf Orthogonalität und Parallelit

 

Neuling0421

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.06.2017, 09:36     Titel: Überprüfung von Punkten auf Orthogonalität und Parallelit
  Antworten mit Zitat      
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));

for n=1:size(A,1)
 
  for m=2:size(A,1)

       if(A(n,1)/A(m,1)~=A(n,2)/A(m,2) && dot(A(n,:),A(m,:))~=0)
 
             B(m)=1; %Alle Zeilen mit dem Eintrag 1 sollen dann später bei A gelöscht
                          %werden
             
       end

   end

end


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.

Beste Grüße
Neuling


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.06.2017, 14:45     Titel: Re: Überprüfung von Punkten auf Orthogonalität und Parall
  Antworten mit Zitat      
Hallo Neuling0421,

Punkte können nicht parallel oder senkrecht sein, nur Vektoren können das.

In der Erklärung suchst Du nur nach dem "Nachbarpunkt", im Code testest Du aber alle Punkte untereinander.

Wenn Du nur den Nachbarpunkt meinst:
Code:
A = rand(1e5,2);  % 1e5 ist eine Konstante, 10^5 eine teure Power-Operation
n = size(A, 1);

isOrtho = dot(A(1:n-1, :), A(2:n, :), 2) == 0;
isPar  = (A(1:n-1, 1) * A(2:n, 2) - A(2:n, 1) * A(1:n-1, 2)) == 0;
A(~isOrtho && ~isPar) = [];

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:
Code:
atan2(norm(N1 x N2), dot(N1, N2))

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.06.2017, 15:58     Titel:
  Antworten mit Zitat      
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
Code:
isPar isOrth


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.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.06.2017, 12:04     Titel:
  Antworten mit Zitat      
Hallo,

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.
Code:
isOrtho = dot(A(1, :), A, 2) == 0;
isPar  = (A(1, 1) * A(:, 2) - A(:, 1) * A(1, 2)) == 0;


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
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.06.2017, 17:58     Titel:
  Antworten mit Zitat      
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:

Code:

A=rand(10e5);
k=size(A,1);
B=ones(k,1);

for n=2:k

if(~para(A) && ~ortho(A))
B(i)=0;

end
end

N=A(find(B),:);
 


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?

Beste Grüße
Neuling0421
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.06.2017, 19:33     Titel:
  Antworten mit Zitat      
Hallo,

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?

Zitat:
Code:

Das erzeugt eine 10e5 x 10e5 Matrix. Ist das gewollt?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2017, 19:41     Titel:
  Antworten mit Zitat      
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:
Code:

e1 = [1 1 0]

e2 = [0 0 1]

e3 = [0 1 0]

 

Zwar ist e1 orthogonal zu e2 und e2 orthogonal zu e3, aber e1 ist nicht orthogonal zu e3.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.06.2017, 02:49     Titel:
  Antworten mit Zitat      
Hallo,

In Deinem Beispiel tauchen 3D-Punkte auf. Bisher hattest Du nur von 2D gesprochen:
Zitat:
Code:

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2017, 06:59     Titel:
  Antworten mit Zitat      
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.

Gruß
Neuling0421
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.06.2017, 08:47     Titel:
  Antworten mit Zitat      
Hallo,

Noch eine Frage zu der ersten Nachricht:
Zitat:
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.06.2017, 10:04     Titel:
  Antworten mit Zitat      
Es soll der zweite Punkt/Vektor gelöscht werden.

Gruß
Neuling0421
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.