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

Abstand zwischen Koordinaten für Tabelle berechnen

 

Loderunner

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.01.2013, 15:17     Titel: Abstand zwischen Koordinaten für Tabelle berechnen
  Antworten mit Zitat      
Hallo,

ich habe eine Tabelle. Diese hat 8 Spalten, wobei nur Spalte 1,Spalte 2 Spalte 7 und Spalte 8 relevant für mich sind.

Spalte 1 besitzt x-Koordinaten
Spalte 2 besitzt y-Koordinaten
Spalte 7 Zeit
Spalte 8 Trajektoriennummer (1 beduetet dass diese Koordinaten alle zu Trajektorie 1 gehören, 2 zu trajektorie 2,usw.)

Zum Versuch: Es wurden Kolloide beobachtet, die sich bewegen. Alle 0,1 sekunden wurde ein Bild gemacht, anhand dessen die Koordinaten rausgelesen wurden.
Beispiel:

63.3729 345.5839 0 1
64.5893 347.9483 0.1 1
65.8284 349.8362 0.2 1
.
.
.
34.7473 347.4748 0 2
35.3823 348.4838 0.1 2

usw.


Insgesamt reicht die Trajektorienzahl bis 2000.

Ich soll nun anhand der Koordinaten und der Zeit die Geschwindigkeit für jedes 0.1sek Zeitfenster berechnen.

dazu müsste ich ja praktisch den Abstand zwischen x,y koordinaten zu den vorherigen x,y koordinaten berechnen( über Pythagoras) und dann diesen Abstand durch die verstrichene Zeit Teilen(also immer durch 0.1 sek)

wie kann ich das mit Matlab machen? Ich bin nicht wirklich eine Leuchte in Matlab. Bin froh dass ich Bilder öffnen kann.

Hab versucht irgendwie ne Schleife zu basteln, aber hab keine AHnung wie ich da ansetzen soll...


Vioele Grüße

Chris


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.01.2013, 23:02     Titel:
  Antworten mit Zitat      
Hallo,

erster Ansatz:

Code:
sqrt(diff(x).^2 + diff(y).^2) / 0.1


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Loderunner

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.02.2013, 09:27     Titel:
  Antworten mit Zitat      
Das hab ich so auch schon versucht (Bzw. so in der Art;-)

Es taucht aber dann ein Fehler auf:

Error:The input charakter is not valid in MATLAB statements or expressions

die "hoch 2" ist dabei auch rot.


Ist mit dem "diff(x)"- code eigentlich gewährleistet dass er die 2.zahl von der ersten, die dritte von der zweiten und so weiter abzieht?
und wie krieg ich es hin dass er die Geschwindigkeiten von der ersten Trajektorie berechnet, dann ein Break macht und dann mit der 2.Trajektorie anfängt?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.02.2013, 10:47     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Error:The input charakter is not valid in MATLAB statements or expressions

die "hoch 2" ist dabei auch rot.


Das Problem kann ich nicht nachvollziehen. Bitte den genauen verwendeten Code posten.

Zitat:
Ist mit dem "diff(x)"- code eigentlich gewährleistet dass er die 2.zahl von der ersten, die dritte von der zweiten und so weiter abzieht?

Genau umgekehrt. Da aber ohnehin quadriert wird, ist das egal.

Zitat:
und wie krieg ich es hin dass er die Geschwindigkeiten von der ersten Trajektorie berechnet, dann ein Break macht und dann mit der 2.Trajektorie anfängt?

Du kannst dir die verschiedenen Teile z.B. mit logischer Indizierung herausholen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Loderunner

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.02.2013, 11:28     Titel:
  Antworten mit Zitat      
ich habe dein Code genau so übernommen wie er da steht. Da das nicht funktioniert hat, habe ich

Code:
v=sqrt((diff(x).*diff(x))+(diff(y).*diff(y)))/0.1


genutzt. Kommt ja aufs gleiche raus.


das amcht er auch ganz schön (zumindest kann ich kein Fehler erkennen;-)

Wie läuft das mit der logischen Indizierung? Kann ich ihm sagen dass er die oben erwähnte Berechnung für alle machen soll die in der 8.Spalte eine 1 haben? und dann für alle, die in der 8.Spalte ne 2 haben? usw.?


Danke dir schonmal für deine Mühen!!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.02.2013, 11:43     Titel:
  Antworten mit Zitat      
Hallo,

wenn deine Daten in data liegen, dann z.B. so

Code:
for I = unique(data(:,8))
dataSelect = data( data(:,8) == I, :);
% Verarbeiten der I-ten Trajektorie
end


Sollte die Laufzeit so zu lange sein, kann man auch überlegen, wie man das effizienter hinbekommt. Frage dazu: sind die Informationen für eine Trajektorie immer zusammenhängend, oder kann es sein, dass später nochmal weitere Informationen für eine Trajektorie kommen?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Loderunner

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.02.2013, 14:21     Titel:
  Antworten mit Zitat      
Die Informationen sind immer zusammenhängend. Das heisst dass erst alle x und y koordinaten für Trajektorie 1 aufgelistet sind, dann für trajektorie 2 usw.

Hab den Code von dir mal genutzt:

Meldung: Error using == Matrix dimensions must agree...
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.02.2013, 17:01     Titel:
  Antworten mit Zitat      
Hallo,

Vermutliches Problem: der Vektor für die for-Schleife sollte ein Zeilenvektor sein:

Code:
for I = unique(data(:,8))' % <-- transponieren für Zeilenvektor
dataSelect = data( data(:,8) == I, :);
% Verarbeiten der I-ten Trajektorie
end


Probiers mal bitte damit.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Loderunner

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.02.2013, 09:58     Titel:
  Antworten mit Zitat      
Kommt an die Stelle von "% Verarbeiten der I-ten Trajektorie" dann die zuvor genannte Formel
Code:
v=sqrt((diff(x).*diff(x))+(diff(y).*diff(y)))/0.1
??

Oder wie muss ich das verstehen?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.02.2013, 10:01     Titel:
  Antworten mit Zitat      
Hallo,

natürlich musst du aus dataSelect dann erst mal noch x und y herausholen, aber ansonsten: ja.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Loderunner

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.02.2013, 10:41     Titel:
  Antworten mit Zitat      
Ahh du sprichst in Rätseln:-)

Würde der Code so passen?
Code:
data=dlmread(‚dateiname‘,‘‘,x,y);% Datei einlesen
X=data(:,1);
Y=data(:,2);

for I = unique(data(:,8))' % <-- transponieren für Zeilenvektor
dataSelect = data( data(:,8) == I, :);
v=sqrt((diff(x).*diff(x))+(diff(y).*diff(y)))/0.1
end
 
Loderunner

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.02.2013, 10:43     Titel:
  Antworten mit Zitat      
Hab das mal so gemacht und er spuckt nun seit ner halben Stunde Zahlen aus. X und y haben jeweils aber auch 475000 Werte.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.02.2013, 10:50     Titel:
  Antworten mit Zitat      
Hallo,

ich finde, es bringt wenig Lerneffekt, wenn ich alles mundgerecht liefere, man aber nicht versteht, was dabei passiert. Rätsel sind allerdings nicht beabsichtigt.

Zu deinem Code: du extrahierst X und Y, verwendest aber x und y. Das passt nicht zusammen. Zudem werden in der Schleife immer dieselben x und y verwendet, was auch nicht wirklich sinnvoll ist. Das wiederholte Ausspucken von Zahlen liegt an einem fehlenden Strichpunkt.

Ich dachte eher an sowas:
Code:
for I = unique(data(:,8))' % <-- transponieren für Zeilenvektor
dataSelect = data( data(:,8) == I, :);
x = dataSelect(:,1);
y = dataSelect(:,2);
v{I}=sqrt((diff(x).*diff(x))+(diff(y).*diff(y)))/0.1;
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.02.2013, 10:52     Titel:
  Antworten mit Zitat      
Hallo Loderunner,

Wenn Du die Zeilen mit einem Semikolon abschließt, werden nicht mehr sinnfrei und zeitraubend Zahlen ins Commandwindow geschrieben.

In Deinem Code wird "dataSelect" gar nicht benutzt und in jeder Iteration "v" überschrieben. Statt "diff(x)" zweimal auszurechnen, wäre dies doppelt so schnell:
Code:

diffx = diff(x);
diffy = diff(y);
v=sqrt((diffx .* diffx) + (diffy .* diffy)) * 10;

Mit 10 zu multiplizieren ist übrigens billiger als durch 0.1 zu teilen.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.02.2013, 11:30     Titel:
  Antworten mit Zitat      
Erstmal vielen, vielen Dank. Is echt grandios was Matlab alles kann.

Wenn ich den Code richtig verstanden habe, habe ich jetzt für jede Trajektorie eine Anzahl an Geschwindigkeiten, die anhand der Koordinaten und der Zeit berechnet wurden.Richtig?

Und diese ganze Sache mit I wurde gemacht, damit er in der zusammenhängenden Tabelle nicht zwischendrin die Geschwindigkeit des Vektors von der letzten x,y-Koordinate von Trajektorie 1 und der ersten x,y-Koordinate von Trajektorie 2 berechnet? Richtig?

Wenn ich mir v ausspucken lasse, listet er mir dann für jede Trajektorie auf wieviel Geschwindigkeiten berechnet wurden (wenn da steht [116x1 double]=116 Geschwindigkeiten?)?? Sehe ich das auch richtig?

und mit v{1} kann ich auf die Geschwindigkeiten der ersten Trajektorie zugreifen!!(Das hab ich selbst rausgefunden:-D


Kann ich den höchsten Geschwindigkeits-Wert im kompletten Datensatz mit max (v{I}) rausfinden? Oder hab ich da wieder ein Denkfehler?

Genauso stellt sich für mich die Frage, wie ich ein Histogramm über alle Geschwindigkeiten im Modell plotten kann.
Code:
hv=hist(v?, bx) ??

(bx wäre dann z.B.
Code:
bx=0:vmax/100:vmax


und dann
Code:
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.