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

Jahres-und Monatsmittelwerte einer 70-jährigen Zeitreihe

 

metronomy

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2010, 11:59     Titel: Jahres-und Monatsmittelwerte einer 70-jährigen Zeitreihe
  Antworten mit Zitat      
Ein freundliches Hallo an alle MATLAB-wissenden!

Ich möchte Jahres- bzw. Monatsmittelwerte einer etwa 70-jährigen Datenreihe, die auf Tagesmittelwerten basiert, errechnen. D.h. ich habe für jeden Tag einen Wert und möchte daraus die Mittelwerte errechnen. Im der txt.-file sind lediglich die Daten für jeden Tag enthalten kein Datumsvektor.

Ich hab mir folgende Gedanken drüber gemacht, wie man das am besten lösen könnte, habe aber keinerlei Planung wie ich es in Matlab umsetzen kann:

Letztendlich würde ich MAtlab einfach auffordern aller 365 bzw. 366 Tage einen Mittelwert zu errechnen und diesen dann in einem anderen Vektor auzugeben.

Code:
[T]=textread('Z:\Nutzer\MatlabTest\input.txt','%f','headerlines',1);

n=length(T);

for i=1:n
    annual_mean=mean(T(1:365,1));
end

 


Das wäre das erst einmal fürs erste Jahr. Für die darauffolgenden ist es leider nicht ganz so einfach. Wie schreibe ich dann den zweiten Mittelwert an die stelle annual_mean=(2,1) und den dritten in die dritte Zeile usw.?

Probleme sind zudem für mich die Schaltjahre:die Reihe beginnt 1920 und endet 1990.
Um die Schaltjahre zu identifizieren hatte ich mir ne Funktion gebastelt, aber ich frage mich ob es nicht einfacher geht?! Ich will nur intern das Datum dazuerzeugen (eventuell mit Julian Day?) --> gibt es da eine Funktion die die fortlaufenden Tageszahlen ab einem bestimmten Datum ausgibt?

Für Anregungen wär ich echt total dankbar!!
Smile


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.10.2010, 12:40     Titel: Re: Jahres-und Monatsmittelwerte einer 70-jährigen Zeitreih
  Antworten mit Zitat      
Hallo metronomy,


Code:
[T]=textread('Z:\Nutzer\MatlabTest\input.txt','%f','headerlines',1);

annual_mean = zeros(1, 70);  % Pre-allocation!!!
index1 = 1;
index2 = Inf;
for i = 1:70
    % Schaltjahr oder nicht:
    if rem(1919 + i, 4)  % Kein Gedöns zwischen 1920 und 1990
       days = 365;
    else
       days = 366;
    end
   
    % Letzter Tag im Jahr:
    index2 = index1 + days - 1;

    % Mittelwert:
    annual_mean(i) = mean(T(index1:index2));
   
    % Erster Tag im nächsten Jahr:
    index1 = index2 + 1;
end
 

Das geht zwar noch effizienter mit ACCUMARRAY und HISTC, wenn Du vorher die Jahreszahl mit DATEVEC und DATENUM als Vektor berechnest. Der Aufwand lohnt sich allerdings nicht: 10 Minuten mehr nachdenken und Programmieren, 10 Minuten länger debuggen, aber nur ein Paar Sekunden weniger Laufzeit.

Viel Erfolg, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
metronomy

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2010, 14:55     Titel:
  Antworten mit Zitat      
Hey Jan,

vielen vielen Dank für die schnelle Antwort! Das ist wirklich clever gemacht! DIese denkweise sollte ich mir übernehmen!
Noch eine kleine Frage: Was bedeutet INF? Und warum wird das als 'Startwert' genutzt? Ist das ähnlich dem NaN, oder?(Hab in der Hilfe schon mal gestöbert)
Wenn ich die ganze Sache noch auf Monatsmittelwerte runterschrauben möchte, müsste ich ähnlich vorgehen und in der for-schleife einhaken, oder?
Ich habe alle Monate mit einem Wert belegt (also jenachdem 31, 30 oder 28 bzw. 29 Tage)
Muss ich da noch zusätzlich einen index hinzufügen? Nicht nur einen, oder?!
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.10.2010, 16:14     Titel:
  Antworten mit Zitat      
Hallo metronomy,

Matlab kann die Frage nach INF sehr gut selbst beantworten:
Code:

Die Benutzung von HELP kann ich nur wärmstens empfehlen.
Ich hätte statt INF auch NaN, -1 oder Pi verwenden können.

Wie sinnvoll sind denn Monats-Durchschnitte, wenn ein Monat mal 28, ein anderer 31 Tage hat? Ein 30.4-Tages-Monat wäre physikalisch gesehen sinnvoller. Andernfalls landet man bei so schrägen Ergebnissen wie:
"Die Anzahl von Unfällen, die an einem Freitag den 13. passieren, ist höher als die Anzahl derer, die an einem Donnerstag den 13. passieren."
Und wieso ist das so? Es gibt einfach mehr Freitage als Donnerstage, die auf einen 13. eines Monats fallen.

Aber natürlich sieht man in tausenden von Statistiken Monatsdurchschnitte. Das würde ich dann auf alle Fälle DATEVEC überlassen:
Code:

firstDay = floor(datenum([1920, 1, 1, 0, 0, 0]));
lastDay = floor(datenum([1990, 12, 31, 0, 0, 0]));
vecDay = datevec(firstDay:lastDay);
 

Achtung: Bitte teste, ob vecDay die richtige Anzahl von Tagen hat. Eventuell gehen die Daten ja bis zum 01.01.1991!
Jetzt ist vecDay eine [#Tage x 6] Matrix mit den Jahreszahlen in der ersten und den Monatszahlen in der zweiten Spalte.
Einen Jahresdurchschnitt kann man nun so erhalten:
Code:
annual_mean(i) = mean(T(vecDay(:, 1) == 1919 + i));

Einen Durchschnitt über einen Monat aller Jahre:
Code:
monthly_mean(j) = mean(T(vecDay(:, 2) == j));

Und wenn Du dann noch die Monats-Mittelwerte für jedes Jahr erhalten möchtest, kannst Du das kombinieren:
Code:

m = zeros(1, 12 * 70);
k = 0;
for i = 1:70
  matchYear = (vecDay(:, 1) == 1919 + i);
  for j = 1:12
    k = k + 1;
    m(k) = mean(T(and(matchYear, vecDay(:, 2) == j)));
  end
end
 

Die Methode einen Vektor mit einem logischen Ausdruck zu indizieren heisst (ach was?!) "logical indexing". Sie ist im Allgemeinen viel schneller als die numerischen Indices zunächst per FIND zu berechnen. In der Dokumentation steht mehr dazu.

Gruß, Jan[/b]
Private Nachricht senden Benutzer-Profile anzeigen
 
metronomy

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.10.2010, 10:21     Titel:
  Antworten mit Zitat      
Hey Jan!

Funktioniert wunderbar und bringt mir auch mal ein bisschen Licht ins Dunkel der Matlab-Vorgehensweise. Ich hätte es viel umständlicher und länger formuliert, aber du hast mir hier einen sehr praktischen Weg gezeigt wie es auch kürzer und genauso effektiv geht! DANKE!!!

EIn Problem hab ich noch mit dem Verstehen des logicsl indexing. Da werd ich mich aber ein bisschen belesen und nicht weiter deine Zeit in Anspruch nehemn.

Vielen Dank nochmal!
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.10.2010, 13:16     Titel:
  Antworten mit Zitat      
Hallo metronomy,

für große Daten-Mengen (10e6) würde man das noch deutlich schneller und kompakterformulieren:
Die beiden Spalten für Jahr und Monat lassen sich zusammenfassen:
Jahr*100 + Monat.
Dann per ACCUMARRAY alle Zahlen zum gleichen JahrMonat-Index zusammen addieren und per HISTC die Zahl der jeweiligen Tage berechnen, zum Schluß beides dividieren.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2012, 13:28     Titel:
  Antworten mit Zitat      
Hallo...

hier möchte ich mich doch gleich nochmal einklinken. (Toller Ansatz da oben übrigens!)

Wie siehts denn aus wenn ich einen Mittelwert über eine bestimmte Zeitspanne erhalten möchte? Sagen wir 10 Jahre?!

ich hab da schon mal was ausprobiert:

Code:
mean_10(i,1) = nanmean(T2(vecDay(:, 1) == (startyr-1) + i : (startyr-1) + i+9 ));


da erscheint aber die Fehlermeldung

Code:
Error using  ==
Matrix dimensions must agree.


Mir ist schon klar, warum da gemeckert wird. Man vergleicht ja 2 unterschiedliche Dinge. Aber wie löse ich das Problem?
Ich komm nicht drauf.
 
surfer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2012, 15:49     Titel:
  Antworten mit Zitat      
Keiner eine Idee?
 
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.