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
Forum-Century

Forum-Century


Beiträge: 115
Anmeldedatum: 12.01.16
Wohnort: ---
Version: R2012b+
     Beitrag Verfasst am: 12.01.2016, 16:21     Titel: Streckenberechnung aus x-y-Koordinaten
  Antworten mit Zitat      
Hallo liebe Forengemeinde,

ich hoffe der Beitrag ist im Richtigen Bereich, es ist mein erster.

zur Idee meiner Funktion. Ich möchte die Länge einer Strecke kummulativ in einen Vektor speichern und in einem Plot die x oder y Koordinaten des Weges, die ich gegeben habe als Funktion der Strecke ausgeben.



Code:
function [ s_rand ] = s_rand( x , y )
%s_rand Berechnet kummulativ einen Vektor der die Strecke für die
%Randpunkte der Strecke ausgibt.
%   Detailed explanation goes here

%s_rand = zeros(size(x)); % Erstellung des Vektors in geeigneter Größe

%Erstellung des Vektors
for k = 1:size(x)
    k=1;
    %Unterscheidungen ob x,y wächst oder sinkt um die Summe für den Weg
    %korrkt zu bilden
   
    if (x(k+1)>x(k))%x wächst
        if (y(k+1)>y(k))%y wächst
            s_rand = cumsum (sqrt((x(k+1)-x(k))^2+(y(k+1)-y(k))^2));
            break
        end
        if (y(k+1)< y(k))% y sinkt
            s_rand = cumsum (sqrt((x(k+1)-x(k))^2+(y(k)-y(k+1))^2));
            break
        end
    end
    if (x(k+1)< x(k))%x sinkt
        if (y(k+1)< y(k))%y wächst
            s_rand = cumsum (sqrt((x(k)-x(k+1))^2+(y(k)-y(k+1))^2));
            break
        end
        if (y(k+1)>y(k))%y sinkt
            s_rand = cumsum (sqrt((x(k)-x(k+1))^2+(y(k+1)-y(k))^2));
            break
        end
    end
    s_rand;    
end


die Funktion rufe ich in einem Skript folgendermaßen auf

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);

plot(sx, x_rand)



was immer zu folgender Fehlermeldung führt:
>> s_rand (x,y)
Subscript indices must either be real positive integers or logicals.



ich verstehe jetzt leider nicht ganz wo mein Fehler liegt. Die Eingaben für x_rand und y_rand sollten doch integers sein oder?

Die if-Bedingungen habe ich so geschrieben, dass der die Strecke auch tatsächlich immer größer wird...

Vielen Dank schonmal für das auseinandersetzen mit meinem Code. Falls euch Verbesserungen an meiner "Schreibweise" beim Code einfallen bin ich dafür ebenfalls sehr dankbar.
Private Nachricht senden Benutzer-Profile anzeigen


ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2016, 16:44     Titel:
  Antworten mit Zitat      
Hallo,

vorab mal ne Frage: Wieso setzt du nach der for-Schleife deinen Schleifenzähler k immer auf k=1? Die läuft dann ja nie hoch!

lg
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: 12.01.2016, 17:55     Titel:
  Antworten mit Zitat      
da hast du recht. Habe ich nun vor die Schleife gesetzt, da es initiert werden muss oder?

Error using s_rand
Too many output arguments.

Error in x_s (line 7)
sx = s_rand(x_rand, y_rand);



Code:
function [  ] = s_rand( x , y )
%s_rand Berechnet kummulativ einen Vektor der die Strecke für die
%Randpunkte der Strecke ausgibt.
%   Detailed explanation goes here

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

%Erstellung des Vektors
k=0;
for k = 1:size(x)
   
    %Unterscheidungen ob x,y wächst oder sinkt um die Summe für den Weg
    %korrkt zu bilden
   
    if (x(k+1)>x(k))%x wächst
        if (y(k+1)>y(k))%y wächst
            weg = cumsum(sqrt((x(k+1)-x(k))^2+(y(k+1)-y(k))^2));
            break
        end
        if (y(k+1)< y(k))% y sinkt
            weg= cumsum(sqrt((x(k+1)-x(k))^2+(y(k)-y(k+1))^2));
            break
        end
    end
    if (x(k+1)< x(k))%x sinkt
        if (y(k+1)< y(k))%y wächst
            weg = cumsum(sqrt((x(k)-x(k+1))^2+(y(k)-y(k+1))^2));
            break
        end
        if (y(k+1)>y(k))%y sinkt
            weg = cumsum(sqrt((x(k)-x(k+1))^2+(y(k+1)-y(k))^2));
            break
        end
    end
    weg;    
end
 


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);

plot( sx,x_rand,'o')
grid on
 


das ist der veränderte code. hab auch s_rand innerhalb der funktion umbenannt, da ich dachte das könnte auch zu fehlern führen.
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: 12.01.2016, 20:14     Titel:
  Antworten mit Zitat      
Hallo,

die Funktion gibt keine Rückgabeargumente zurück:
Code:
function [  ] = s_rand( x , y )


Du versuchst aber, welche zurückzuholen.
Code:
sx = s_rand(x_rand, y_rand);


Das passt nicht zusammen.

Warum aber das ganze so kompliziert? Wenn du quadrierst, ist das Vorzeichen doch ohnehin gleichgültig.

Meines Erachtens:
Code:
weg = cumsum( sqrt( diff(x).^2 + diff(y).^2 ) )


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: 12.01.2016, 20:49     Titel:
  Antworten mit Zitat      
Da könntest du recht haben. Habe nur an die Summe selbst gedacht.

Sollte wg als Rückgabe reichen?
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: 12.01.2016, 21:27     Titel:
  Antworten mit Zitat      
Hallo,

ich würde noch ein e spendieren ;)

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: 13.01.2016, 00:54     Titel:
  Antworten mit Zitat      
ich danke für die Hilfe.
ich habe es hinbekommen.


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
k=0;
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
    weg;    
end
 


Gibt es eine Möglichkeit, wie ich die zwei if's entfernen könnte, einfach um den Code weiter zu verkürzen? denn auf x(k-1) kann ich ja nicht zugreifen bei k==1
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: 13.01.2016, 06:02     Titel:
  Antworten mit Zitat      
Hallo,

du kannst wie gesagt die gesamte Funktion zu einer Zeile zusammenfassen:
Code:
weg = cumsum( sqrt( diff(x).^2 + diff(y).^2 ) )
 


Wenn dich nur der gesamte Weg interessiert, dann sum statt cumsum .

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: 13.01.2016, 08:54     Titel:
  Antworten mit Zitat      
Ahh ok das diff ist gut.
Ich benötige
Code:
um die x und y Werte als Funktion des bis dahin zurückgelegten Weges anzeigen zu lassen. Diese mach ich dann zu Splines um die Krümmung und weiteres zu berechnen
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, 10:53     Titel:
  Antworten mit Zitat      
Wenn ich die Funktion mit diff verwende bekomme ich mehrere Fehlermeldungen Confused

Warning: Input arguments must be scalar.
> In s_rand at 4
In x_s at 6

Error using chckxy (line 89)
The number of sites, 6, is incompatible with the number of values, 7.

Error in spline (line 54)
[x,y,sizey,endslopes] = chckxy(x,y);

Error in x_s (line Cool
cs = spline(sx,x_rand);



die Orangenen waren schon davor da.

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);

cs = spline(sx,x_rand);
xx = linspace(0,sx(length(sx)),100);
plot(sx,x_rand,'o',xx,ppval(cs,xx),'-');
grid on

%plot(xx,ppval(cs,xx),'-');
%plot(sx,x_rand)

 


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
k=0;
for k = 1:size(x)

    weg = cumsum( sqrt( diff(x).^2 + diff(y).^2 ) ) ;
    weg;    
end
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, 12:12     Titel:
  Antworten mit Zitat      
Hallo,

du musst aufpassen da durch diff immer ein Wert verloren geht, was heißt das dein weg um einen Wert weniger hat als dein x oder y!

Zum spline! Dies würde so funktionieren -->

Code:

t=0:length(sx)-1; %Somit startet dein plot mal bei 0
tt=0:0.1:length(sx)-1; % Feine Abstufung für den Spline (kannst selbst bestimmen)

cs=spline(t,sx,tt);

plot(t,sx,'o',tt,cs)
 


Jetzt plottet er dir deine Wegpunkte als Kreise und zeichnet dir einen spline durch! Passt das mal so?
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, 12:45     Titel:
  Antworten mit Zitat      
ich glaube dann macht er nicht mehr das was ich will.

ich möchte auf der Abzisse den weg und auf der Ordinate die x-Werte als Funktion des Weges.
das wäre so glaube ich nicht gegeben
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, 13:26     Titel:
  Antworten mit Zitat      
Hallo,

kannst du vielleicht einmal ein Diagramm zeichnen und als Bild hochladen?? oder kurz einen matlab-plot der mit achsen zeigt was du wo haben willst!!

Ich hab mir gedacht du willst den zurückgelgten Weg (sx) als spline darstellen! Ich häng mal ein pic an ob du sowas meinst okay!

Unbenannt.png
 Beschreibung:

Download
 Dateiname:  Unbenannt.png
 Dateigröße:  28.13 KB
 Heruntergeladen:  317 mal
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, 13:35     Titel:
  Antworten mit Zitat      
so sieht es bei mir aus.
eigentlich sieht es bei dir gar nicht so schlecht aus. schreibst du in den t vektor den weg vektor aus der funktion?
wusste ich nicht, dass es so funktioniert wie du das gemacht hattest.

Code:


weg.jpg
 Beschreibung:

Download
 Dateiname:  weg.jpg
 Dateigröße:  46.22 KB
 Heruntergeladen:  378 mal
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, 13:47     Titel:
  Antworten mit Zitat      
Hallo,

aber bei dir stimmt es ja mit dem überein was du willst oder! Du hast auf der y-Achse deine x-Werte - auf der x-Achse den Weg und den spline schön durch gezogen!

Was willst du daran noch ändern?
Private Nachricht senden Benutzer-Profile anzeigen
 
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.