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

Punktpaare aus Matrizen vergleichen

 

slinshady
Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 22.01.2016, 10:53     Titel: Punktpaare aus Matrizen vergleichen
  Antworten mit Zitat      
Hallo ich habe zwei verschieden große Matrizen A(n,2) und B(m,2) mit n>m. Beide enthalten Punktpaare, also in jeder Zeile die x und y Koordinaten eines Punktes.
ich benötige eine möglichst "schöne" Funktion zu schreiben, die zu jedem Punkt aus Matrix A den nächstliegenden Punkt aus Matrix B findet und mir dessen Zeile m zurückgibt.
Meine Idee war eine for-Schleife in der ich für einen Punkt aus A die Matrix B durchlaufe und den Betrag des Vektors nehme also

Code:

a = A(x,:);
for l = 1:size(B,1)
      b = B(l,:);
      c(l) = sqrt( (b(1,1)-a(x,1))^2 - (b(1,2)-a(x,2))^2 );
end
d = min(c);
e = find(d == c);

 


Funktioniert das so wie ich mir das Gedacht habe und der zu A(x,Smile am nähesten liegende Punkt wäre dann B(e,Smile ?

In der Wurzel muss nicht mit .^2 gearbeitet, da es sich um Skalare handelt oder?
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 22.01.2016, 11:13     Titel:
  Antworten mit Zitat      
ich würde es erstmal ohne schleife machen
und müsste das nich n + sein beim pytagoras ?
Code:
A=rand(100,2)*10;
B=rand(10,2)*10;
dx=bsxfun(@minus,A(:,1),B(:,1)');
dy=bsxfun(@minus,A(:,2),B(:,2)');
d=dx.^2+dy.^2;
[~,indx]=min(d,[],2);

grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
slinshady
Themenstarter

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 22.01.2016, 11:34     Titel:
  Antworten mit Zitat      
ja klar + !
sucht die bsxfun mit @minus auch das korrekte Punktpaar? Oder kann es sein, dass die x und y Werte dann evtl verschiedenen Punkten zugehören? jetzt habe ich noch ein problem mit der Rückgabe der min auf diese Art.
in dem Array [~,indx] steht der minimale Abstand in Spalte 1 und in indx der zugehörige Index von B?

die "bestmögliche" Ausgabe wäre ein Array das mit es sozusagen zurückgibt

[Index von Punkt aus A, Index des nähesten Punktes aus B]

Generell: Würde ich mit dieser Variante ein Array zurückgegeben, dass mir zu jedem Punkt aus A den Index des nächstgelegenen Punktes aus B beschreibt?
( P1 = A( 1,: ) ; in P1 steht dann der x und y Wert des ersten Punktes, der in A gespeichert ist. Es war vorhin glaube ich blöd von Punktpaaren zu reden )
Dies wäre natürlich gut, da ich die Methode dann nur einmal anwenden müsste und nicht für jeden Punkt aus A das Array B durchsuchen müsste.

Danke schonmal
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 22.01.2016, 11:45     Titel:
  Antworten mit Zitat      
Zitat:
sucht die bsxfun mit @minus auch das korrekte Punktpaar? Oder kann es sein, dass die x und y Werte dann evtl verschiedenen Punkten zugehören?

wie meinst du das? hast du angst das er willkürlich irgendwelche werte berechnet? das macht matlab eher selten.
Zitat:
in dem Array [~,indx] steht der minimale Abstand in Spalte 1 und in indx der zugehörige Index von B?

probier es doch aus.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
slinshady
Themenstarter

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 22.01.2016, 12:20     Titel:
  Antworten mit Zitat      
Code:
abstand=sqrt(dx.^2+dy.^2);


ich habe noch die Wurzel ergänzt, oder hast du sie beabsichtigt weggelassen, da es Rechenzeit sparen würde?
Leider funktioniert das Addieren so nicht, da die Vektoren verschieden groß sind
Error using +
Matrix dimensions must agree.


Was ich gerade erst sehe. Warum transponierst du B?

zu erstem: nein ich dachte nur, dass in dx und dy jeweils der kürzeste abstand eines x wertes bzw y wertes von a zu b gesucht wird, aber es wird ja an der i-ten Stelle in dx und dy geschrieben. Wie groß sind dx und dy eigentlich? es müsste doch an sich für jeden Punkt aus A alle Abstände zu den Punkten aus B gespeichert werden



zweites versuche ich erstmal, dass ich es eingebaut bekomme in meinen Code bekomme und etwas damit anfangen kann.

Zuletzt bearbeitet von slinshady am 22.01.2016, 12:34, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 22.01.2016, 12:33     Titel:
  Antworten mit Zitat      
Zitat:
ich habe noch die Wurzel ergänzt, oder hast du sie beabsichtigt weggelassen, da es Rechenzeit sparen würde?
das war der grund ja.
ich würde die wurzel später zihen. das sind ja n mal weniger werte aus denen die wurzel gezogen werden muss.
Zitat:
Leider funktioniert das Addieren so nicht, da die Vektoren verschieden groß sind
Error using +
Matrix dimensions must agree.

das lässt sich ohne den entsprechenden code nicht nachvollziehen und darum kann dir auch keiner sagen warum.
Zitat:
es müsste doch an sich für jeden Punkt aus A alle Abstände zu den Punkten aus B gespeichert werden

ja. probier es doch an einem einfachen beispiel aus. das sihst du was der code macht.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
slinshady
Themenstarter

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 22.01.2016, 13:03     Titel:
  Antworten mit Zitat      
die Matrix A hat um genau zu sein 117 Zeilen und B 106. Allerdings soll der Code natürlich allgemein gehalten werden. An sich sollten dx und dy die 117 x und y Werte der Punkte aus P die am nächsten zu den Punkten aus A liegen zurückgeben.

edit:
ich habe mir dx und dy jetzt einmal ausgeben lassen und es handelt sich jeweils um eine 117x106 Matrix
ich müsste vermutlich zwei for-schleifen anlegen um damit die matrix einmal in der zeile und dann in der spalte zu durchlaufen und die abstände dann berechnen oder?.
dann wäre es speichertechnisch aber wohl sinnvoll den min abstand zu berechnen sobald ich eine zeile durchlaufen bin oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 22.01.2016, 13:12     Titel:
  Antworten mit Zitat      
es ist um sooooo vieles einfacher wenn du den code postest und ich nicht immer alles erraten muss was du machst. was klappt den mit meinem vorschlag oben nicht?
Zitat:
dann wäre es speichertechnisch aber wohl sinnvoll den min abstand zu berechnen sobald ich eine zeile durchlaufen bin oder?

eine 117x106 matrix braucht 99kb speicher.. wenn du das ganze also nicht auf einem c64 betreibst sollte es klappen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
slinshady
Themenstarter

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 22.01.2016, 14:01     Titel:
  Antworten mit Zitat      
Code:
A=rand(117,2)*10;
B=rand(106,2)*10;

dx=bsxfun(@minus,A(:,1),B(:,1)');
dy=bsxfun(@minus,A(:,2),B(:,2)');
size(dx)
size(dy)

abstand=dx.^2.+dy.^2;
% [~,indx]=min(abstand,[],2);
% size(abstand)


in A und B stehen die x,y Koordinaten zu Punkten die am Rand einer Strecke gemessen wurden. A ist der Linke und B der Rechte Rand. Ich möchte jetzt für das größere der beiden Arrays Trapeze auf der Strecke bilden in dem ich den nächstgelegen Punkt aus B zu einem Punkt aus A nehme und dann den nächsten (B+1) zum folgenden Punkt aus A.
Mit Punktweiser Addition funktioniert nun auch das abstand1 Array

Die min-Funktion lierfert dann den Index jeder Zeile und der Spaltenwert müsste doch dem entsprechenden Punkt aus B zu A entsprechen oder? Außerdem liefert sie noch das Minimum selbst. Die Dimension sollte dann size(B) sein oder?

Code:

for i=1:size(A,1)
            a = A(i,1);
            b = A(i,2);
            c = A(i+1,1);
            d = A(i+1,2);
            e = B(indx,1);
            f = B(indx,2);
            g = B(indx+1,1);
            h = B(indx+1,2);
...


nun habe ich eine Gleichung allgemein errechnet, die mir daraus für einen Punkt in der Mitte den Abstand zu beiden Rändern berechnet. Dazu komme ich allerdings erst, wenn ich diese Intervalle bestimmt bekomme ^^

Sry, dass ich nicht direkt alles gepostet bin ich dabei, deinen Code einzubauen um es mit meinem nächsten Stück Code zu verwurschteln

Zuletzt bearbeitet von slinshady am 22.01.2016, 14:12, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 22.01.2016, 14:08     Titel:
  Antworten mit Zitat      
gut also sehe ich das richtig das das ursprüngliche problem, zu jedem punkt von A den dichtesten punkt aus B zu finden gelöst ist ?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
slinshady
Themenstarter

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 22.01.2016, 14:17     Titel:
  Antworten mit Zitat      
das habe ich gerade noch oben dazu editiert:
Die min-Funktion lierfert dann den Index jeder Zeile und der Spaltenwert müsste doch dem entsprechenden Punkt aus B zu A entsprechen oder? Außerdem liefert sie noch das Minimum selbst. Die Dimension sollte dann size(B) sein oder?


ich bin mir noch nicht sicher, da ich noch nicht weiß, ob ich das Minimum finde. bzw wie ich es auslese
Wie kann ich denn für A(i) aus der Matrix die min übergibt den zugehörigen Index für B bekommen?

Code:


            a = A(i,1);
            b = A(i,2);
            c = A(i+1,1);
            d = A(i+1,2);
            e = B([~,i],1);
            f = B([~,i],2);
            g = B([~,i+1]+1,1);
            h = B([~,i+1]+1,2);

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 22.01.2016, 14:34     Titel:
  Antworten mit Zitat      
Zitat:
Außerdem liefert sie noch das Minimum selbst.
durch den ~ nicht. der wert des minimums ist ja uninteressant. wenn du ihn aber haben willst kannst du den wert auch ausgeben lassen ja.
Zitat:
Die Dimension sollte dann size(B) sein oder?

welche dimension... wenn dann die 1. dimension von A da ich ja zu jedem A wert einen B wert suche der am dichtesten dran ist.
Zitat:
Wie kann ich denn für A(i) aus der Matrix die min übergibt den zugehörigen Index für B bekommen?

indx(i)
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
slinshady
Themenstarter

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 22.01.2016, 14:51     Titel:
  Antworten mit Zitat      
ich habe es ein bisschen ausprobiert und das scheint mein Problem zu lösen!

ICH DANKE DIR RECHT HERZLICH!!!!!!

das musste fett und groß sein Wink

ich schließe dann das Thema und melde mich mit einem neuen, wenn ich wieder nicht mehr weiter komme ^^
Private Nachricht senden Benutzer-Profile anzeigen
 
slinshady
Themenstarter

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 22.01.2016, 17:59     Titel:
  Antworten mit Zitat      
Mir ist nochmal was eingefallen, was ich wissen muss.
Weshalb wird B transponiert? und mir ist bei derbsxfun die @hypot funktion noch aufgefallen, wäre das nicht die pythagoras variante? ist diese Interessant?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 30.01.2016, 16:33     Titel:
  Antworten mit Zitat      
Zitat:
Weshalb wird B transponiert?

Zitat:
The corresponding dimensions of A and B must be equal to each other or equal to one. Whenever a dimension of A or B is singleton (equal to one), bsxfun virtually replicates the array along that dimension to match the other array.

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
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 - 2025 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.