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

Streckenberechnung aus x-y-Koordinaten

 

slinshady
Themenstarter

Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 13.01.2016, 13:50     Titel:
  Antworten mit Zitat      
eigentlich nichts. Nur ob es irgendwie programmiertechnisch Wege gibt das schöner zu schreiben. ^^
Geht mir eigentlich nur darum noch etwas zu lernen Smile
Private Nachricht senden Benutzer-Profile anzeigen


ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2016, 14:08     Titel:
  Antworten mit Zitat      
Achso,

nein ich denke mit diff und spline bist du bei dem was du vor hast schon ganz gut dran! Was du noch machen kannst ist, dass du in deiner function den ersten Wert für den Weg auf Null setzt - da er ja bei null beginnt und nach der ersten Berechnung mit diff seinen zurückgelegten Weg erreicht!

Ist aber nur eine Spielerei - du kannst aber gerne nochmal deinen gesamten Code posten - dann schau ich gerne drüber ob noch was interessantes zum erwähnen wäre!

Lg, Rob
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: 13.01.2016, 15:41     Titel:
  Antworten mit Zitat      
Hallo slinshady,

Welches ist die Zeile 89 in chckxy?

Dies ist seltsam:
Code:
k=0;  % Wozu dient dies?
for k = 1:size(x)
    weg = cumsum( sqrt( diff(x).^2 + diff(y).^2 ) ) ;
    weg;    % Das ist überflüssig?!
end

Der Inhalt der Schleife hängt gar nicht vom Schleifenzähler "k" ab. Auf der rechten Seite wird immer wieder das gleiche berechnet.

Gruß, Jan
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: 13.01.2016, 20:43     Titel:
  Antworten mit Zitat      
mein aktueller Code sieht folgendermaßen aus:

Code:
%plottet x_rand als Funktion der Strecke s_rand

x_rand = 10*rand(7,1);
y_rand = 10*rand(7,1);

sx = s_rand(x_rand, y_rand);
xx=0:0.1:sx(length(sx)); % Feine Abstufung für den Spline
cs = spline(sx, x_rand,xx);

plot(sx,x_rand,'o',xx,cs,'-');
grid on



Code:
function [ weg ] = s_rand( x , y )
%s_rand Berechnet kummulativ einen Vektor der die Strecke für die
%Randpunkte der Strecke ausgibt.
%weg =  zeros(size(x),1) ; % Erstellung des Vektors in geeigneter Größe
% Belegung des Vektors

for k = 1:size(x)
    if (k>1)
        weg(k) = weg(k-1) + sqrt((x(k)-x(k-1))^2+(y(k)-y(k-1))^2);
    end
    if (k==1)
        weg(k) = sqrt((x(k))^2+(y(k))^2);
    end
   
end
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 13.01.2016, 21:00     Titel:
  Antworten mit Zitat      
Diese Zeile zur Initialisierung solltest du nicht auskommentieren.

Code:
%weg =  zeros(size(x),1) ; % Erstellung des Vektors in geeigneter Größe


Es spart erheblich Rechenzeit wenn Ergebnisvektoren, welche in einer Schleife verwendet werden, schon vor der Schleife pre-allociert sind. Dadurch wird ständiges Umspeichern vermieden. Vorraussetzung ist natürlich das du die Dimensionen des Ergebnisvektors kennst/abschätzen kannst.
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: 13.01.2016, 21:12     Titel:
  Antworten mit Zitat      
Die Größe kenne ich. Habe das %-Zeichen entfernt.
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2016, 10:18     Titel:
  Antworten mit Zitat      
Hallo,

noch ein kleiner Anreiz von mir - du kannst im Prinzip in diesem Fall die for-Schleife komplett weglassen, da alles nötige bekannt ist - ich habs mal so gelöst:

Code:

weg(1) = sqrt(x(1)^2+y(1)^2); %1.Weg ist jeweils von 0 bis x(1) bzw. y(1)

weg(2:length(x)) = weg(1)+cumsum(sqrt(diff(x).^2+diff(y).^2));
 


Soll das gleiche Ergebnis bringen - ich finds persönlich ohne Schleifen besser! MatLab ist auch dafür gemacht mit Matrizen zu rechnen ohne die Verwendung von Schleifen Smile

Auf die sogenannte pre-allocation

Code:

weg = zeros(size(x),1);
 


kannst du somit auch verzichten!

Lg, Rob
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: 14.01.2016, 10:43     Titel:
  Antworten mit Zitat      
oh ja danke, das funktioniert ebenfalls Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

nochmal zur Klarstellung: mein Vorschlag
Code:
weg = cumsum(sqrt(diff(x).^2+diff(y).^2));

führt die komplette Wegberechnung in einer Zeile durch. Dies in eine for-Schleife zu packen ist unnötig, um nicht zu sagen: unsinnig.

Die Frage ist, ob (0,0) implizit als Startpunkt angenommen werden soll.
Falls ja, stimmt ro_mats Vorschlag von 9:18. Kompakter wäre in diesem Fall:
Code:
weg = cumsum(sqrt(diff([0, x]).^2+diff([0, y]).^2));

(Annahme, dass x und y Zeilenvektoren sind)

Falls nicht, das "0," weglassen; s.o.

Grüße,
Harald
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: 14.01.2016, 11:22     Titel:
  Antworten mit Zitat      
x und y werden mir später als eine (n,2), aber die kann ich dann ja auslesen und anders abspeichern. ich hab mir nur mal selbst etwas schreiben wollen, um mich in das thema hinein zu arbeiten.
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2016, 11:33     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

nochmal zur Klarstellung: mein Vorschlag
Code:
weg = cumsum(sqrt(diff(x).^2+diff(y).^2));

führt die komplette Wegberechnung in einer Zeile durch. Dies in eine for-Schleife zu packen ist unnötig, um nicht zu sagen: unsinnig.

Die Frage ist, ob (0,0) implizit als Startpunkt angenommen werden soll.
Falls ja, stimmt ro_mats Vorschlag von 9:18. Kompakter wäre in diesem Fall:
Code:
weg = cumsum(sqrt(diff([0, x]).^2+diff([0, y]).^2));

(Annahme, dass x und y Zeilenvektoren sind)

Falls nicht, das "0," weglassen; s.o.

Grüße,
Harald


Wow das geht? Heißt das das diff zuerst dann x(1)-0 berechnet und dann eben x(2)-x(1)? Also er setzt im Prinzip einfach eine 0 vor meinen Zeilenvektor x?
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: 14.01.2016, 11:45     Titel:
  Antworten mit Zitat      
ich weiß, dass falls x und y gleich große Zeilenvektoren sind du den spline auch so schreiben kannst

Code:
yy = spline (x, [0 y 0]);


dann sind die zwei zusätzlichen 0 die Anfangs- und Endsteigung des Splines

Funktioniert leider nicht so

Code:
yy = spline (x, [0 ;y ;0]);


falls x und y gleich große Spaltenvektoren sind Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2016, 11:48     Titel:
  Antworten mit Zitat      
Dann transponier doch x und y - check mal ob das direkt geht

Code:

yy = spline(x',[0 y' 0]);
 
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: 14.01.2016, 11:53     Titel:
  Antworten mit Zitat      
Transponieren funktioniert, jap.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.