Verfasst am: 22.01.2016, 10:53
Titel: Punktpaare aus Matrizen vergleichen
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);
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.
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
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?
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.
_________________
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
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);
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?
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.
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.