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

Intervall mit variabler Größe finden und ausgeben

 

Xoko

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2013, 20:39     Titel: Intervall mit variabler Größe finden und ausgeben
  Antworten mit Zitat      
Hallo!

Ich habe folgendes Problem an dem ich jetzt schon länger tüftle: Ich habe einen seeeeehr langen Vektor, nämlich eine minütliche Wind- Zeitreihe über mehrere Monate, und nun möchte ich für jeden Tag (also für jedes 24Stunden-Intervall) 2 kleinere Intervalle finden!
Morgens dreht der Wind von Süd auf Nord, und Abends von Nord auf Süd!

Leider passiert das nicht von einem Zeitschritt auf den nächsten, sondern kann schon mal eine halbe Stunde dauern. Also dachte ich mir ich definiere das Intervall so:


erster Wert=180°
....
letzter Wert=0°

Ich habe schon die Differenzen zwischen en einzelnen Zeitschritten berechnet, also gesagt wenn die Differenz größer als 0 ist dann schreibt er mir diese Komponente des Vektors heraus!

Aber wie erkläre ich Matlab dass es mir ein ganzes Intervall mit den geforderten Bedingungen herausschreiben soll, von dem ich nicht genau sagen kann wie groß es sein wird??

Und wie bestimme ich von diesem Intervall dann genau den mittlersten Wert?

Hilfe...


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 08.12.2013, 20:52     Titel:
  Antworten mit Zitat      
Hallo Xoko,

Wenn du Beispielcode (mit Bsp. für die Daten) angeben könntest, könnte man dir helfen ohne raten zu müssen Wink

Grüße,
Seban
Private Nachricht senden Benutzer-Profile anzeigen
 
Xoko

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2013, 21:34     Titel:
  Antworten mit Zitat      
Ok stimmt, also hier ist mal das was ich hab soweit:

In dieser ersten Schleife wird der Unterschied in der Windrichtung (also von Vektor gem_Winddir) von einem Zeitschritt auf den nächsten berechnet und in den neuen Vektir Differenz geschrieben. Diese Differenz quadriere ich dann um vom Vorzeichen unabhängig zu sein:

Code:


for i=1:length(gem_Winddir)-1;

    if gem_Winddir(i)==0;

    Differenz(i)=gem_Winddir(i)-gem_Winddir(i+1);                    Differenz_absolut(i)=Differenz(i)^2;  
   
 end
end

 


In der 2ten Schleife versuche ich den Umschwungpunkt festzulegen indem ich einfach jene Punkte suche wo sich die Windrichtung geändert hat (also die Differenz ungleich 0 ist) und diese Punkte auch im Datumsvektor (=Zeit) herausschreibe:

Code:

 
  for i=1:length(Differenz)-1
       
    if Differenz_absolut(i) >=0;      
       Umschwung_1(i)=Differenz(i);
      Zeit_Umschwung_1(i)=Zeit(i);                
else Umschwung_1(i)=NaN;
        Zeit_Umschwung_1(i)=NaN;
   
end      
    end

 


Leider bin ich eben draufgekommen dass der Wind nicht von einem Zeitschritt auf den anderen dreht, sondern innerhalb zB einer halben Stunde um 180° dreht - und dieses Untervall wo diese Drehung um jeweils 180° passiert will ich haben!!

Lg Xoko
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 08.12.2013, 22:44     Titel:
  Antworten mit Zitat      
Hi,

* Könnte gem_Winddir bspw. so aussehen (stark vereinfacht natürlich)?
Code:
gem_Winddir = [0 0 0 30 60 90 120 150 180 180 180];


* In deiner ersten Schleife verstehe ich den Sinn der if-Abfrage nicht. Du führst nur Berechnungen durch, wenn gem_Winddir 0 ist

* Warum quadrierst du anstatt abs zu verwenden?

* Ich würde das ganze vektoriell zu lösen versuchen:

Code:
gem_Winddir = [0 0 0 30 50 90 120 130 180 180 180 180 150 100 90 60 30 0 0 0];
time        = 0:length(gem_Winddir)-1;

diff_Winddir        = diff(gem_Winddir);        % Differenz zweier aufeinander-folgender Werte im Vektor (um 1 kürzer!)
diff_Winddir        = abs([0 diff_Winddir]);

% Nur die Zeiten, zu denen sich der Wind dreht
non_zero_Winddir    = find(diff_Winddir);
time_yaw            = time(non_zero_Winddir);   % Zeitintervall der Drehbewegung

% Oder die Zeiten in einem Vektor der Ausgangslänge
log_diff_Winddir    = diff_Winddir > 0;
time_yaw_2          = time .* log_diff_Winddir;

start               = strfind([0 log_diff_Winddir > 0 0],[0 1]);
ende                = strfind([0 log_diff_Winddir > 0 0],[1 0]);
length_of_intervall = ende - start


Hilft das weiter? Bei Fragen, fragen Very Happy

Grüße,
Seban
Private Nachricht senden Benutzer-Profile anzeigen
 
Xoko

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2013, 02:21     Titel:
  Antworten mit Zitat      
Hallo Seban!

Erst mal vielen Dank für deine Hilfe soweit Very Happy

Aber zugegeben - ich hab da ein paar Fragen:

1.) was bedeutet die 0 in den Klammern?

2.) Hm, also heißt das er identifiziert zuerst auch die Differenzen von einem Zeitschritt zum nächsten, und wenn die Differenz größer 0 ist dann schreibt er im Zeitvektor eine 1, ansonsten eine 0 --> multiplizierst du deswegen dann die "gefundenen Punkte" mit dem Zeitvektor?

Was bedeuten die Nullen in diesen Zeilen? Also die erste vor log_diff_Winddir und die erste in der 2ten eckigen Klammer?

Code:

start               = strfind([0 log_diff_Winddir > 0 0],[0 1]);
ende                = strfind([0 log_diff_Winddir > 0 0],[1 0]);

 


Zu deinen Fragen:

Also ich hatte 2 Schleiffen, jeweils eine für die Drehung Süd auf Nord und eine für Nord auf Süd! Deshalb wollte ich Matlab sagen es soll sich zum Beispiel bei der Drehung von Nord auf Süd die Komponenten mit Nordwind anschauen, da die Differenzen berechnen und ja. Ich hab gedacht so kann ich den "Anfang" meines Intervalls finden!

Warum quadriert und nicht abs? Hm, gute Frage - ich hab gar nicht an abs gedacht...

Jedenfalls mal vielen Dank; das hilft mir schon sehr weiter Very Happy

VlG Xoko
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 09.12.2013, 03:33     Titel:
  Antworten mit Zitat      
Gern geschehen Smile

Xoko hat Folgendes geschrieben:
1.) was bedeutet die 0 in den Klammern?

Code:
[0 diff_Winddir]
erzeugt einen neuen Vektor, der als erstes Element eine 0 und dann die Elemente von diff_Winddir beinhaltet.
Das habe ich so gemacht, damit man einen Vektor der Länge des Ausgangsvektors erhält. Durch diff erhält man ja einen um 1 kürzeren Vektor, da immer 2 aufeinanderfolgende Elemente subtrahiert werden.





Xoko hat Folgendes geschrieben:
2.) Hm, also heißt das er identifiziert zuerst auch die Differenzen von einem Zeitschritt zum nächsten, und wenn die Differenz größer 0 ist dann schreibt er im Zeitvektor eine 1, ansonsten eine 0 --> multiplizierst du deswegen dann die "gefundenen Punkte" mit dem Zeitvektor?

Der logische Vektor log_diff_Winddir enthält Einsen an den Stellen, an denen sich der Winkel geändert hat. Durch die Multiplikation mit dem Zeitvektor erhält man dann einen Vektor, der die Zeiten einer Winkeländerung angibt und an den Stellen an denen keine Winkeländerung erfolgt ist steht eine 0 (time_yaw_2). time_yaw hingegen enthält nur die Zeiten einer Winkeländerung, aber die Länge des Vektors ändert sich, was das Ganze schwieriger macht. Ist aber auch vom weiteren Vorgehen abh. welcher Vektor hilfreicher ist.

Um Code nachzuvollziehen, hilft idR. der Debugger. http://www.mathworks.de/de/help/mat.....process-and-features.html
Somit kannst du Zeile für Zeile durch den Code laufen und dir die Variablen in Ruhe anschauen, um zu erkennen was durch die Berechnungen passiert.

Kurzanleitung:
*Bsp. in ein m-File kopieren
*Cursor in 2. Zeile setzen, F12 drücken (Set breakpoint)
*F5 (Run) - Der Debugger stoppt nun in der 2. Zeile
*F10 (Step eine Zeile weiter)
*Wenn du nun den Mauszeiger über eine Variable hältst, wird dir der Inhalt der Variable angezeigt, sofern diese bereits berechnet wurde.
*weiter mit F10 (zeilenweise) oder F5 (bis zum nächsten Breakpoint/Ende der Datei)





Xoko hat Folgendes geschrieben:
Was bedeuten die Nullen in diesen Zeilen? Also die erste vor log_diff_Winddir und die erste in der 2ten eckigen Klammer?

Code:
start               = strfind([0 log_diff_Winddir > 0 0],[0 1]);
ende                = strfind([0 log_diff_Winddir > 0 0],[1 0]);

In der ersten eckigen Klammer wird (wie oben) ein neuer Vektor erzeugt. Das '> 0' braucht es nicht, der Vektor ist ja bereits logisch (hab ich nicht 100% aufgepasst).
In der 2. eckigen Klammer steht das gesuchte Pattern. Der Startbereich ist dort, wo eine 1 (Winkel geändert) auf eine 0 (Winkel gleich) folgt, das Ende umgekehrt (Unter der Voraussetzung, dass ich den Eingangsvektor erraten musste.).
http://www.mathworks.de/de/help/matlab/ref/strfind.html





Xoko hat Folgendes geschrieben:
Also ich hatte 2 Schleiffen, jeweils eine für die Drehung Süd auf Nord und eine für Nord auf Süd! Deshalb wollte ich Matlab sagen es soll sich zum Beispiel bei der Drehung von Nord auf Süd die Komponenten mit Nordwind anschauen, da die Differenzen berechnen und ja. Ich hab gedacht so kann ich den "Anfang" meines Intervalls finden!

Code:
gem_Winddir = [0 0 0 30 50 90 120 130 180 180 180 180 150 100 90 60 30 0 0 0];
time        = 0:length(gem_Winddir)-1;

diff_Winddir            = [0 diff(gem_Winddir)];

log_diff_Winddir_pos    = diff_Winddir > 0; % Drehung 0-180°
time_yaw_pos            = time .* log_diff_Winddir_pos;

log_diff_Winddir_neg    = diff_Winddir < 0; % Drehung 180-0°
time_yaw_neg            = time .* log_diff_Winddir_neg;

% Man kann die logischen Vektoren auch zu einem Vektor zusammenführen (nicht logisch), je nachdem was man anstellen will evtl nützlich
x = log_diff_Winddir_pos - log_diff_Winddir_neg



Grüße,
Seban
Private Nachricht senden Benutzer-Profile anzeigen
 
Xoko

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.12.2013, 23:06     Titel:
  Antworten mit Zitat      
Hallo Seban!

Ok, echt nochmal vielen vielen Dank!!!! Ich bin unendlich dankbar dass es Leute wie dich gibt die sich wirklich die Zeit nehmen und "Verzweifelten" wie mir helfen!!

Also danke! Hab einen schönen Advent Very Happy

VlG Xoko
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 10.12.2013, 23:32     Titel:
  Antworten mit Zitat      
Vieles von dem was ich hier im Thread gepostet habe, hab ich hier im Forum gelernt als ich in meinem esrten Hiwi-Job Zeit-/Messreihen auswerten musste und selber verzweifelter Matlab-Neuling war.

Vielleicht stolperst du ja auch irgendwann mal über einen Thread zu dem du was beitragen kannst.

Beste Grüße,
Seban
_________________

Richtig fragen
Debugging
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 - 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.