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

Ergebnisse aus for-Schleife in Matrix abspeichern

 

Mr.Burns
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 26.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2013, 10:53     Titel: Ergebnisse aus for-Schleife in Matrix abspeichern
  Antworten mit Zitat      
Hallo liebes Forum,

ich habe folgende 2 Schleifen geschrieben, das Problem, das ich habe ist bei beiden das gleiche. Matlab berechnet alles einwandfrei, und zeigt die jeweiligen Ergebnisse auch im Command Window an. Allerdings wird immer nur das Ergebnis aus dem letzten Rechenschritt in F bzw. G abgespeichert.

Dabei ist M eine Matrix mit 8 Spalten. Die Jahresvektoren gehen von 1992 bis 2012 und Monate logischerweise von 1 bis 12.
1. Schleife:
Es soll der Mittelwert für jeden Monat berechnet werden (deshalb 21*12 = 252 Zeilen für F bzw. G) und abgespeichert werden


Code:

M = [tag monat jahr stunde minute o3_rei o3_sad o3_nor];

F = ones(252,3);
for i = 1992:2012
for j = 1:12
    F = nanmean(M(M(:,3)==i & M(:,2)==j,6:8));
end
end
 


2. Schleife:
Bei dieser Schleife möchte ich Jahresmittelwerte berechnen, also für jedes Jahr von 1992 bis 2012 immer 3 Werte (Mittel über die letzten 3 Spalten aus M):

Code:

G = ones(21,3);
for i = 1992:2012
    G = nanmean(M(M(:,3)==i,6:8));
end
 


Wie kann ich diese Ergebnisse in den Matrizen F/G abspeichern?
Vielen Dank schon mal!

lg
Mr.Burns
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

du musst natürlich in F bzw. G indizieren.

Im zweiten Fall:
Code:
G(i, :) = ...


Im ersten Fall ist es komplizierter, da du für den Index eine relativ komplizierte Kombination aus i und j erzeugen müsstest. Da wäre ich für ein 3D-Array, etwa:
Code:
F(i-1991, j, :) = ...


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Mr.Burns
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 26.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2013, 11:33     Titel:
  Antworten mit Zitat      
Hallo Harald,

beim 2. Fall funktioniert dein Vorschlag so aber nicht. Nach deiner Lösung macht Matlab ja 2012 Zeilen (=Wert des letzten i). Es sollen aber nur 21 sein (so wie vorher alloziert).
Weil Matlab soll ja alle Werte in M suchen wo die 3.Spalte = 1992...1993...usw....2012 ist und dann in die Ergebnismatrix schreiben:
Aber macht man folgendes:

Code:

G = ones(21,3);
for i = 1992:2012
    G(21,:) = nanmean(M(M(:,3)==i,6:8));    
end
 


dann ist wiederrum nur die letzte Zeile von G belegt, vorher steht 20mal die ones.

lg
Mr.Burns
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2013, 11:41     Titel:
  Antworten mit Zitat      
Hallo Mr.Burns,

Harald hat Dir für F schon gezeigt, wie es prinzipiell funktioniert. Die Übertragung auf G sei hier als wiederholende Übung dem Leser überlassen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ja, da musst an sich nur meine beiden Vorschläge kombinieren.
Um solche Kopfstände zu vermeiden, mache ich ja lieber folgendes:

Code:
Jahre = 1992:2012;
for i = 1:numel(Jahre)
% jetzt Jahre(i) verwenden
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Mr.Burns
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 26.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2013, 12:15     Titel:
  Antworten mit Zitat      
Hallo,

also ich stehe bei diesen Schleifen mal komplett auf dem Schlauch. Wenn ich doch vorher die Matrix mit 21 (im 2. Fall) und 252 (im 1. Fall) alloziere, dann ist es doch seltsam, wenn ich beim indizieren auf einmal i reinschreibe, und Matlab dann 2012 Zeilen macht.
Wie gesagt: ich bin total ratlos. Sad

lg
Mr.Burns
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
dann ist es doch seltsam, wenn ich beim indizieren auf einmal i reinschreibe, und Matlab dann 2012 Zeilen macht.

Nicht seltsam, sondern vollkommen logisch, wenn i bis 2012 läuft.

Was du vorbelegst ist vollkommen gleichgültig, wenn der Index darüber hinausläuft. Es heißt ja nur, dass der entsprechende Bereich vorbelegt ist, nicht dass die Matrix nicht darüber hinaus wachsen kann. Es ist die Verantwortung des Programmierers, die richtigen Indizes anzugeben, MATLAB kann ja nicht hellsehen.

Also nochmal Fall 2:
Code:

Jahre = 1992:2012;
G = ones(21,3);
for i = 1:numel(Jahre)
    G(i,:) = nanmean(M(M(:,3)==Jahre(i),6:8));
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Mr.Burns
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 26.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2013, 13:02     Titel:
  Antworten mit Zitat      
Hallo,

ok das funktioniert dann für den 2.Fall super. Vielen Dank! Manchmal hat man solche Denkblockaden, dass man auf die einfachsten Dinge nicht kommt. Aber ich fürchte, ich werde demnächst noch öfter meine Fragen hier im Forum anbringen.
Auch für den 1.Fall habe ich nun die Lösung dank eurer Hilfe geschafft. Die Idee mit der 3d-Matrix war genial.

lg
Mr.Burns
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.