Verfasst am: 16.04.2013, 11:07
Titel: Abstand zwischen zwei Kurven berechnen
Hallo zusammen,
ich habe keine Ahnung von Matlab, muss aber für meine Diplomarbeit eine Auswertung machen. Matlab-Hilfe und Google konnten mir nicht wirklich weiter helfen.
Vielleicht ist es für den ein oder anderen ein leichtes und kann mir hier eine Hilfestellung geben.
Ich habe 2 unterschiedliche Datensätze von GPS-Koordinaten eines Rundkurses (Teststrecke, 80km). Einmal berechnetete Koordinaten mit jedem Meter eine Punkt für Breiten (x) bzw. Längengrad (y) (=80000 Punkte) und einmal für jeden zweiten Meter Daten aus GoogleMaps (=40000 Punkte).
Ich habe einen Plot der beiden Datensätze erstellt und rein grafisch liegen diese beiden Kurven in etwa übereinander. Bei starker Vergrößerung der Graphen sind jedoch Abweichungen zu sehen.
Diese Abweichungen würde ich gerne berechnen (lassen) um fest zu stellen ob dies vernächlässigbar sind oder ob die (berechneten Daten) überarbeit werden müssen (die Daten aus GoogleMaps sollen als Referenzdaten dienen).
Dazu würde ich gerne ein Skript erstellen das mir den Abstand zwischen den beiden Kurven ausgibt. Ich stelle mir das wie folgt vor:
Zwischen den Punkten der Referenzdaten (40000) führe ich eine lineare Polation (alternitiv evtl. mit Splines) durch und fälle das senkrechte Lot auf die Punkte der berechneten Werte (80000), daraus ergibt sich dann der Abstand.
Verfasst am: 16.04.2013, 15:08
Titel: Re: Abstand zwischen zwei Kurven berechnen
Hallo Funkyspike,
Die Erklärung, was die Daten darstellen, ist gar nicht nötig. Wichtiger wäre es zu wissen, wie die Daten nun genau vorliegen. Hast Du zwei Matrizen mit jeweils 2 Spalten für X- und Y-Position?
Heißt "Polation" eigentlich "Interpolation"? Von Splines würde ich absehen.
Wie wäre es, aus den beiden Kurven ein Polygon zu erzeugen und per POLYAREA dessen Fläche zu berechnen? Die könnte man durch die Länge einer der Kurven dividieren und bekommt die durchschnittliche Entfernung.
natürlich meine ich lineare Interpolation.
Ich habe die Daten als "Column vectors" (aus Excel) importiert, also 4 einzelne Spalten.
Deine Lösung ist schonmal nicht schlecht und versuche ich auch umzusetzen, jedoch bringt es mir nur ein Mittel, eine max. Abweichung wäre mir jedoch schon wichtig(er).
@Winkow
hin bekommen habe ich
>> plotyy(Latgps,Longps,latmaps,lonmaps);figure(gcf);
Angefangen habe ich, zum reinkommen, mit einem Kurzskript zur Einführung in Matlab.
Sonst habe ich nur die Suche genutzt, ob es bereits ein ähnliches Problem gibt. Wie gesagt habe keine Ahnung von Matlab benötige (hoffentlich) nur diese eine Auswertung.
ich komme mit meinem Problem nicht weiter, und komme (leider) auch gerade nicht dazu mich in die Materie einzuarbeiten, weil andere Teile meiner Arbeit wichtiger sind.
Vielleicht kann mir jemand Stück für Stück unter die Arme greifen.
Nochmal kurz, was habe ich: 4 Vektoren (x1,y1,x2,y2)
Die Vektoren x1 und y1 enthalten jeweils <79924x1 double> Datenpunkte,
x2 und y2 jeweils <39859x1 double>.***
Theoretisch stelle ich mir meine Auswertung wie folgt vor:
Ich würde gerne durch meine 79924 Punkte Geraden laufen lassen, also immer von Punkt zu Punkt.
Die Geradengleich bekomme ich ja aus zwei gegebenen Punkten [P(x11/y11) Q(x12/y12)] => Meine Gerade g: x=p+r*(q-p)
Also nächstes soll das Lot (also Steigung der Gerade *(-1)) mit EINEM Punkt der Vektoren (x2,y2) geschnitten werden.
Mal davon abgesehen, dass ich die Programmierung der Geraden schon nicht hinbekomme (und mir hier schon einen Wolf gesucht habe), aber mir da vielleicht ein Kumpel helfen kann, sehe ich jetzt das größte Problem, denn nun soll Matlab den am naheliegensten Punkt (aus x2 und y2) finden, mit dem Lot schneiden und mir den Abstand "ausspucken".
Dann die nächste Gerade durch Q und R usw...
Vielleicht hat ja jemand langeweile...
Die Lösung von Jan habe ich versucht, habe auch ein Ergebnis bekommen, aber das Ergebnis ist für mich nicht aussagekräftig, weil ich nicht weiß ob Überschneidungen der Flächen vorhanden sind und mir der Maximale Abstand wichtig ist, das Mittel bringt mir leider nichts
Vielen Dank schonmal bis hierhin fürs durchlesen
***alternativ habe ich auch 2 Matrizen A und B, die dann die gleichen Daten enthalten, dann jeweils x1 und y1, bzw 2 , in den Spalten nebeneinander stehen haben.
P.S. Ich hoffe ich habe nicht zu viel durcheinander geworfen und mein Problem ist verständlich.
Welche Art von Hilfe stellst Du Dir vor? Es ist ja Deine Diplomarbeit. Ist es dann in Ordnung, wenn Du jemand anderes ein Programm dafür schreiben lässt und du dies natürlich in der Arbeit auch unter "Hilfmittel" erklärst? Oder erwartet Dein Betreuer, dass Du das selbst löst?
In ersterem Fall könnte auch die Rubrik "Programmieraufträge" hilfreich sein.
Das Problem ist auf jeden Fall verständlich beschrieben. Die Implementierung ist eigentlich nicht schwer. Die Gleichungen der Mittelsenkrechten und die Formel für den Abstand zwischen Punkten und Geraden sind elementare Vektorrechnung. Vielleicht hast Du ja noch Deine alten Schulhefte greifbar. Aber Wikipedia kennt die Formeln auch.
Dann noch eine FOR-Schleife über alle Punkte - zur Not benötigt eine ineffiziente Implementierung ein paar Minuten länger, aber das sollte nicht das Problem sein, oder?
Ich helfe immer lieber, wenn die Fragenden zumindest Ansätze in Matlab posten.
Welche Art von Hilfe stellst Du Dir vor? Es ist ja Deine Diplomarbeit. Ist es dann in Ordnung, wenn Du jemand anderes ein Programm dafür schreiben lässt und du dies natürlich in der Arbeit auch unter "Hilfmittel" erklärst? Oder erwartet Dein Betreuer, dass Du das selbst löst?
In ersterem Fall könnte auch die Rubrik "Programmieraufträge" hilfreich sein.
Hallo Jan, im schlimmsten Fall den ersteren Fall, natürlich würde ich es gerne selbst machen, aber, ich habe noch nie was mit Matlab zu tuen gehabt.
Mein Betreuer will nur ein Ergebnis, hat mir dazu geraten nach fertigen Skripten zu gucken "da gibts bestimmt schon was..." - Super, Danke!
Jan S hat Folgendes geschrieben:
Das Problem ist auf jeden Fall verständlich beschrieben. Die Implementierung ist eigentlich nicht schwer. Die Gleichungen der Mittelsenkrechten und die Formel für den Abstand zwischen Punkten und Geraden sind elementare Vektorrechnung. Vielleicht hast Du ja noch Deine alten Schulhefte greifbar. Aber Wikipedia kennt die Formeln auch.
Dann noch eine FOR-Schleife über alle Punkte - zur Not benötigt eine ineffiziente Implementierung ein paar Minuten länger, aber das sollte nicht das Problem sein, oder?
Von Hand könnte ich das Problem lösen, das wäre kein Problem (naja, der Umfang halt!! deswegen Matlab), die mathematischen Grundlagen dazu kann ich noch einigermaßen, ist ja einfachste Oberstufenmathematik.
Mir fehlt aber jegliche Grundlagen von Matlabprogrammierung, so weiß ich vorallem nicht wie ich auf meine Daten richtig zugreife.
Eine Hilfestellung für den Anfang wäre vielleicht nicht schlecht.
Ich habe die Daten (kurzer Auszug) für die Kurve A wie folgt abgelegt:
A ]___1_______2___
A1] 49.0188 8.4371
A2] 49.0187 8.4372
A3] 49.0186 8.4373
A4] 49.0185 8.4374
Und jetzt weiß ich schon nicht wie ich in Matlab vorgehen soll, da ich z.B. immer nur Ansätze für 3 Punkte habe, die einzeln als P,Q,R abgespeichert sind, aber nicht wie oben dargestellt.
y1=(A2)+r*(A2-A1)
y2=(A3)+r*(A3-A2) usw...
Vielleicht kann mir dieses "Problem" jemand lösen/schreiben, dass ich einen Ansatz habe und dann weiter versuchen kann...
vielleicht irgendwie so in der art. wenn deine strecken geschlossen sind bekommst du damit die fläche zwischen beide raus. wenn du dann noch die länge kennst kennst du auch den abstandt
vielleicht irgendwie so in der art. wenn deine strecken geschlossen sind bekommst du damit die fläche zwischen beide raus. wenn du dann noch die länge kennst kennst du auch den abstandt
Hallo,
ja, die Kurven sind geschlossen. Dein Ansatz habe ich (wahrscheinlich komplizierter, oder zu einfach!?) schon versucht, ABER, wie oben schon geschrieben bekomme ich nur den mittleren Abstand, der hilft mir aber nicht. Zumal, wenn die Flächen sich überschneiden stimmt auch das Mittel nicht. Mir ist der maximale Abstand wichtig.
Aber ich glaube ich habe gerade wieder eine Kleinigkeit dazu gelernt.
"y1=x.^2" ist dieser "." das was mir oben die Schwierigkeiten macht? Läuft er nun einen Punkt nach dem anderen durch?
Ich versuche mal weiter an meinem Ansatz zu basteln.
um den geneaun abstandt zu berechen müsste man ja sonst irgendwie die normalen vektoren bilden etc aber wenn du eh linear interpolierst...
p.s. der . bei .* steht für elementweise multiplikation. sonst est es matrix multiplikation
aber da gehts schon wieder los, dass "r" nicht definiert ist, desweiteren würde ich das gerne automatisch durchlaufen lassen, weil ich kann ja nicht alle 79924 Geraden aufstellen, naja können schon...
Als Ergebnis hätte ich dann gerne das Matlab mir die Geradengleichung ausspuckt, damit ich die Normal bilden kann.
so, hab mich mit meinem Betreuer mal hingesetzt und wir haben zusammen was gebastelt.
jetzt hab ich schonmal ein Grundgerüst, aber vorerst habe ich immernoch eine Kleinigkeit. Ich würde gerne alle 78 zwischenergebnisse speichern, sowohl den Abstand, als auch die Schnittpunkte. Wie geht das?
Hab da schon was rumprobiert mit "end+1", aber das hab ich nicht kapiert.
Also ich habe das ganze nochmal überarbeitet habe aber noch Schwierigkeiten mit der Programierung und (und teilweise auch mit meinem Verständnis) vielleicht erkennt ja jemand meine Fehler/Probleme.
Worum es insgesamt geht steht im Beitrag vom 06.05.2013, 14:38.
Was habe ich jetzt für ein Problem.
Meine Matrix A hat ca. 80000 Werte, B ca. 40000.
Jetzt möchte ich für meine Geradenabschnitte gucken welches der kürzeste Abstand zu meinen Punkten von B ist.
Da A knapp doppelt so groß ist wie B könnte man annähernd annehmen, dass zwischen A1 und A2 B1 liegt, zwischen A3 und A4 B2 usw. Was ist aber wenn der Punkt B1 zwischen A2 und A3 liegt. (das file durchläuft ja alle Geradenabschnitte von A).
Deswegen versuche ich in der zweiten Schleife meine Punkte von B +/- 5 durch laufen zu lassen um mir dann den kürzesten Abstand ausgeben zu lassen.
Und eigentlich hätte ich gerne dass in meiner Matrix abstand_xy der kürzeste Abstand für das jeweilige i gespeichert wird.
Aber selbst wenn das klappt, stimmts ja immer noch nicht, weil, dadurch das A=2*B habe ich das Problem, dass A genauso schnell durchläuft wie B, aber B darf ja nur halb so schnell durchlaufen, weil sonst bin ich bei B einmal komplett durch die Schleife gelaufen und A ist erst bei 40000 angekommen.
Ich stelle mir sowas wie
Aber selbst wenn das klappt, stimmts ja immer noch nicht, weil, dadurch das A=2*B habe ich das Problem, dass A genauso schnell durchläuft wie B, aber B darf ja nur halb so schnell durchlaufen, weil sonst bin ich bei B einmal komplett durch die Schleife gelaufen und A ist erst bei 40000 angekommen.
Das verstehe ich nicht.
Die Normale der Geraden symbolisch zu berechnen ist sehr aufwändig und unnötig:
Für den Vektor [x, y] ist die Normale dazu [y, x].
Auch für die Schnittpunktberechnungen ist die numerische Berechnung hinreichend einfach aber massiv schneller. Und zwar so schnell, dass es sich kaum lohnt unter den nächsten Nachbarn zu suchen und stattdessen problemlos alle Punkt berücksichtigen, solange es weniger ale eine Millionen sind.
Ich vermute aber immer noch, dass das Problem deutlich einfacher gelöst werden könnte: Suche die zwei Punkte mit dem kleinsten Abstand (z.B. pdist() oder Norm und dann per "[dummy, index] = min()"). Bestimme dann den Abstand zwischen dem Punkt und der Geraden zwischen den beiden gefundenen Punkten. Teste dann noch, ob das erzeugte Dreieck stumpfwinkelig ist (dann liegt nämlich die kürzeste Verbindung zwischen dem Punkt und der Gerade ausserhalb der Strecke).
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.