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

Steigung eines Vektors

 

Philipp68
Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 10.01.2017, 16:25     Titel: Steigung eines Vektors
  Antworten mit Zitat      
Hallo,
ich habe eine Frage zur Berechnung der Steigung eines Vektors. Mir liegt ein Vektor vor, von dem ich in einem bestimmten Intervall die Steigung berechnen will. Als Funktion habe ich "diff" verwendet, die mir zwischen zwei Werten die Differenz ausrechnet. Nun habe ich die Änderung zwischen den Werten aber nicht vom Start und Ende des Intervalls, sozusagen die Gesamtsteigung, die als einzelner Wert anzeigt wird. Gibt es dafür eine weitere Funktion in Matlab?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

wenn ich das richtig sehe, dann
Code:

bzw. mit x-Werten
Code:
(y(end) - y(1)) / (x(end) - x(1))


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

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 10.01.2017, 17:55     Titel:
  Antworten mit Zitat      
Hallo Harald,
genau das kenne ich noch von früher, um die Steigung einer Geraden zu bestimmen

m = (y2 - y1) / (x2 - x1), das geht doch nur bei einer Geraden?!

Bei mir habe ich in diesem Intervall in einzelnen Zeitabschnitten positive und negative Steigungen, also ein eine ZickZack - Form. Ich habe mal die Messdaten in ein anderes Programm geladen, damit du weißt, wie das ganze aussieht. Habe eine lineare Regression durchgeführt, die Steigung ist unten im Feld angezeigt. Ist sowas auch mit Matlab möglich?

Messung.jpg
 Beschreibung:

Download
 Dateiname:  Messung.jpg
 Dateigröße:  330.61 KB
 Heruntergeladen:  373 mal
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: 10.01.2017, 18:04     Titel:
  Antworten mit Zitat      
Hallo Philipp68,

Du kannst entweder von Hand oder mit polyfit eine Gerade durch die Punkte legen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.01.2017, 18:04     Titel:
  Antworten mit Zitat      
Hallo,

da hatte ich die Frage gehörig missverstanden.

Und ja, das ist möglich: polyfit oder allgemeiner fitlm .

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

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 10.01.2017, 18:34     Titel:
  Antworten mit Zitat      
Danke für eure Antwort!
Mit dem Befehl komme ich nicht so klar.
Matlab sagt mir, dass X und Y die selbe Länge haben müssen, was sie auch tun.
Code:

VIA_unter_Anstieg = polyfit([1 20],Daten1(30:50,3),1);

% X = 1:20, Y sind 20 Werte aus Spalte 3
 

Wie würde es denn per Hand aussehen?
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: 10.01.2017, 19:22     Titel:
  Antworten mit Zitat      
Hallo Philipp68,

Zitat:
Matlab sagt mir, dass X und Y die selbe Länge haben müssen, was sie auch tun.

Bitte poste immer eine Kopie der vollständigen Fehlermeldung anstatt sie ungefähr nachzuerzählen. Denn dabei verschwinden im Allgemeinen die Details, die man noch nicht verstanden hat.

Code:
VIA_unter_Anstieg = polyfit([1 20],Daten1(30:50,3),1);

"Daten1(30:50,3)" ist ein Vektor der Länge 21, nicht 20.
"[1, 20]" ist ein Vektor der Länge 2 mit den Elementen 1 und 20. Ich vermute, Du meinst stattdessen "0:20".

Wenn Matlab in der Fehlermeldung erklärt, dass die Inputs unterschiedliche Länge haben, lohnt es sich mit den Debugger die Länge der Vektoren zu untersuchen: Setze einen Breakpoint in die Zeile und schaue Dir die Inputs an, wenn Matlab bis zu dieser Zeile gekommen ist:
Code:
size([1, 20])
size(Daten1(30:50,3))


Zitat:
Wie würde es denn per Hand aussehen?

Suche z.B. bei WikiPedia nach "Lineare Regression".

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 11.01.2017, 12:46     Titel:
  Antworten mit Zitat      
Guten Morgen,

hier ist die Fehlermeldung

Error using polyfit (line 47)
X and Y vectors must be the same size.

Error in Kurvenvergleich (line 94)
VIA_unter_Anstieg = polyfit(0:20,Daten1(30:50,3),1);

Bei diesem Thema kann ich gerade nicht weitermachen, da ich nun ein anderes Problem habe, dass ich vorher lösen muss. (Würde dann wieder hier anknüpfen)
Und zwar habe ich in einigen Spalten NaN Elemente und diese Spalten kann ich nicht verwenden und müssen gelöscht werden.

Die Matrix hat die Größe 130 x 15.
Ich kenne den Befehl "isnan" der mir eine Matrix mit "0" und "1" herausgibt, an dessen Stellen NaN vorkommt oder nicht
Mit dem Befehl " = [] " kann ich Zeilen und Spalten löschen.

Kann ich mit einer Schleife nach NaN suchen und diese Spalte löschen?
Ich stehe gerade völlig auf dem Schlauch mit der logical Matrix mit 0 und 1 zu arbeiten.
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: 11.01.2017, 13:22     Titel:
  Antworten mit Zitat      
Hallo Philipp68,

Zitat:
X and Y vectors must be the same size.
VIA_unter_Anstieg = polyfit(0:20,Daten1(30:50,3),1);

Wie die Fehlermeldung schon sagt: Die beiden Inputs haben unterschiedliche Größe. Inzwischen ist der erste ein [1x21] Vektor und der zweite ein [21x1] Vektor. Du bist also nahe dran. Siehe transpose bzw .' .

Bitte stelle in einem Thread immer nur eine Frage. Ansonsten wird der "beantwortet"-Status sinnfrei. Danke!

Zitat:
Kann ich mit einer Schleife nach NaN suchen und diese Spalte löschen?

Ja, das kannst Du.
Ohne Schleife ist es aber einfacher.
Beginne zuerst mit einer exakten Formulierung. Ich nehme an Du meinst:
Lösche alle Spalten in denen ein NaN vorkommt. Dann:
Code:
badCol = any(isnan(M), 1);
M(badCol, :) = [];

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 11.01.2017, 14:45     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank! Jedoch muss ich eine Kleinigkeit ändern, damit die Spalte gelöscht wird.
Du hast geschrieben
Code:

badCol = any(isnan(M), 1);
M(badCol, :) = [];
 


In in der zweiten Zeile muss "badCol" und ":" vertauscht werden,

Code:

badCol = any(isnan(M), 1);
M(:,badCol) = [];
 


Mit polyfit habe ich nun (1:20)' gesetzt und es kommt keine Fehlermeldung mehr. Werde mich da nun weiter mit probieren Smile

Eine kurze Frage zum mean - Befehl. Wenn ich den Mittelwert reihenweise bestimmen will, benutze ich "= mean(Matrix,2);" Gibt die "2" einfach an, dass mean für jede Reihe bestimmt werden soll und ohne spaltenweise?
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: 11.01.2017, 17:16     Titel:
  Antworten mit Zitat      
Hallo Philipp68,

Zitat:
In in der zweiten Zeile muss "badCol" und ":" vertauscht werden,

Ja!

Zitat:
Eine kurze Frage zum mean - Befehl.

Nochmal: Bitte stelle immer nur eine Frage pro Thread. Ansonsten wird der "beantwortet"-Status sinnfrei.
Ich antworte trotzdem wieder hier, da ich es ja auch nicht unnötig kompliziert machen möchte. Aber es hat seinen Sinn, dass das eine Ausnahme bleibt. Danke!

Der Befehl mean(X) bestimmt den Mittelwert entlang der ersten Dimension, die nicht die Länge 1 hat. Für einen Spalten-Vektor also spaltenweise, für einen Zeilen-Vektor über die Zeile. Diese Automatik ist oft sehr praktisch, in Einzel-Fällen aber fies tückisch:
Code:
n = randi(2);
X = rand(n, 4);
Y = mean(X);

Jetzt kann man nicht mehr vorhersagen, ob der Mittelwert über die Zeilen oder Spalten berechnet wird. Ich hatte einen solchen Fall in echtem Code, in dem mehrere Signale gemittelt werden sollten. Wenn ich aber nur ein Signal hatte, bekam ich nicht wie erwartete das Original-Signal und eine Standard-Abweichung von 0, sondern den zeitlichen Mittelwert des Signals.
Seit dem gebe ich bei jeder Funktion grundsätzlich ein, auf welche Dimension ich sie anwenden will:
Code:
xm = mean(Matrix, 2);
ym = mean(Matrix, 1);

Man spart beim Tippen durch das Weglassen des ",1" eine halbe Sekunde, und wenn es schiefläuft sitzt man eine Stunde beim Debuggen von Code, den man mal vor ein paar Jahren geschrieben hat.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 167
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 11.01.2017, 17:33     Titel:
  Antworten mit Zitat      
Ok, entschudlige, werde nächstes Mal einen neuen Thread öffnen.
Vielen Dank für die Hilfe! Smile

Jan, wie lange arbeitest du schon mit Matlab, auch beruflich oder privat?
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: 12.01.2017, 15:18     Titel:
  Antworten mit Zitat      
Hallo Philipp68,

Zitat:
Jan, wie lange arbeitest du schon mit Matlab, auch beruflich oder privat?

Ich habe 1999 mit Matlab 5.3 angefangen. Davor hatte ich in C, C++, Basic und Fortran programmiert. Erfahrungen mit Matlab habe ich gesammelt, als ich ein größeres Programm zur Bewegungs-Analyse für klinische Studien geschrieben habe. Das Programm musste sehr zuverlässig laufen, da damit auch Entscheidungen über Operationen getroffen werden, und es musste für den Einsatz im klinischen Alltag schnell laufen, da jede Wartezeit > 5 sec Stress für die Benutzer bedeutet.
Als ich im Laufe der Jahre einige Erfahrungen angesammelt habe, wäre es doch schade, wenn ich sie nicht in Matlab-Foren weiter geben würde.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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 - 2024 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.