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

Loop bei 3D Matrix anwenden

 

Kathicita
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 20.09.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2020, 11:32     Titel: Loop bei 3D Matrix anwenden
  Antworten mit Zitat      
Hallo,

ich würde gerne einen Loop durch eine 3D Matrix laufen lassen (für jeden Pixel - Längen mal Breitengrad) und weiß leider nicht genau, wie ich das anstellen kann.

Meine Matrix besteht aus Breitengraden (1. Dimension), aus Längengraden (2. Dimension) und Niederschlagswerten (3. Dimension).
Ich würde gerne für jeden Pixel also beginnend bei (1,1,: ) alle Werte aus der Dritten Dimension herausbekommen. Da die Matrix allerdings aus 101 x 202 x 72 Values besteht, wäre es praktisch das ganze mittels eines Loops für alle Pixel jeweils in einem neuen Vektor die 72 Values heraus zu bekommen.

Generell möchte ich den Tag zu den höchsten Niederschlagswerten (bspw. Top 10) für jeden Pixel (jede Location) heraus bekommen.
Hier ist das Problem, dass die Tage in 5-Jahres Abschnitten gezählt werden und somit nicht direkt maxk(Matrix, 10, 3) angewendet werden kann. Hier kommen zwar die Tageszahlen heraus, allerdings ist nicht klar, aus welchem Zeitabschnitt die Tagesnummer stammt.

Um dieses Problem zu umgehen, habe ich mir überlegt, dass ich für jeden Pixel zunächst aus der größeren Top Niederschlagswert-Matrix mir all diese anzeigen lasse und in einen column Vektor konvertiere. Hier alle folgenden Überlegungen am Beispiel für den ersten Pixel


Code:
% for max 72 values
CNRM_prhmax_1970_2005_T72_1_1 = CNRM_prhmax_1970_2005_T_matrix (1,1,:);
% into column
CNRM_prhmax_1970_2005_T72_1_1_c= CNRM_prhmax_1970_2005_T72_1_1(:);


Das selbe würde ich für die 3D Matrix machen, in der zu diesen 72 Werten in der 3. Dimension die jeweils richtigen Tage im Datetime Format vorliegen (vorher pro Zeitabschnitt berechnen lassen und dann hintereinander gefügt).

Code:
% for datetime for max 72 values (T2/T10)
CNRM_prhmax_1970_2005_T72_1_1_d = CNRM_prhmax_1970_2005_T_Date_matrix (1,1,:);
% into column
CNRM_prhmax_1970_2005_T72_1_1_d_c= CNRM_prhmax_1970_2005_T72_1_1_d(:);


anschließend würde ich diesen Vektor mit den Datetimes der Top 72 Werte für den ersten Pixel aufsplitten

Code:
% split datetime
[y,m,d] = ymd(CNRM_prhmax_1970_2005_T72_1_1_d_c);


Danach würde ich eine Matrix erstellen, in der die für den jeweiligen Pixel herausgesuchten Top 72 Werte mit Jahr, Monat und Tag stehen:

Code:
CNRM_prhmax_1970_2005_T72_1_1_d_c_t= [CNRM_prhmax_1970_2005_T72_1_1_c,y,m,d];


Hieraus kann ich jetzt die Top 10 Niederschlags values heraussuchen lassen:

Code:
CNRM_prhmax_1970_2005_T10_1_1_d_c_t=maxk(CNRM_prhmax_1970_2005_T72_1_1_d_c_t, 10, 1);


Anschließend kann ich diese in einzelne Vektoren darstellen lassen. Also einen für die Top 10 Niederschlag Values:

Code:
CNRM_prhmax_1970_2005_T10_1_1_Value=CNRM_prhmax_1970_2005_T10_1_1_d_c_t(:,1);
 


Und anschließend für das Datum, hier werden zunächst die zuvor aufgesplitteten Jahr, Monat und Tag Informationen einzeln abgespeichert und dann in ein Datetime umgewandelt

Code:
CNRM_prhmax_1970_2005_T10_1_1_d_c_t_Year=CNRM_prhmax_1970_2005_T10_1_1_d_c_t(:,2);
CNRM_prhmax_1970_2005_T10_1_1_d_c_t_Month=CNRM_prhmax_1970_2005_T10_1_1_d_c_t(:,3);
CNRM_prhmax_1970_2005_T10_1_1_d_c_t_Day=CNRM_prhmax_1970_2005_T10_1_1_d_c_t(:,4);
CNRM_prhmax_1970_2005_T10_1_1_Date= datetime(CNRM_prhmax_1970_2005_T10_1_1_d_c_t_Year, CNRM_prhmax_1970_2005_T10_1_1_d_c_t_Month, CNRM_prhmax_1970_2005_T10_1_1_d_c_t_Day);
 


Das ganze würde ich nun für jeden einzelnen Pixel durchführen, falls dies möglich ist.
Kann mir da Jemand bei helfen, oder hat da jemand eine Anregung?

Liebe Grüße

CNRM_prhmax_1970_2005_T_matrix.mat
 Beschreibung:

Download
 Dateiname:  CNRM_prhmax_1970_2005_T_matrix.mat
 Dateigröße:  2.69 MB
 Heruntergeladen:  1551 mal
CNRM_prhmax_1970_2005_T_Date_matrix.mat
 Beschreibung:

Download
 Dateiname:  CNRM_prhmax_1970_2005_T_Date_matrix.mat
 Dateigröße:  3.09 MB
 Heruntergeladen:  1625 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

Zitat:
Hier ist das Problem, dass die Tage in 5-Jahres Abschnitten gezählt werden und somit nicht direkt maxk(Matrix, 10, 3) angewendet werden kann. Hier kommen zwar die Tageszahlen heraus, allerdings ist nicht klar, aus welchem Zeitabschnitt die Tagesnummer stammt.

Das sollte sich eigentlich hinbekommen lassen.

Was die Schleife angeht:
Code:
for row = 1:size(CNRM_prhmax_1970_2005_T_matrix, 1)
  for col = 1:size(CNRM_prhmax_1970_2005_T_matrix, 2)
% statt 1,1 immer row, col als Index verwenden.
% temporäre Variablen verwenden für Zwischenergebnisse, die am Ende nicht benötigt werden, z.B. CNRM_prhmax_1970_2005_T72
% Matrizen verwenden für Ergebnisse, die eine Zahl sind, z.B. M(row, col) = ...
% Cell Arrays oder 3D-Arrays verwenden, falls das Ergebnis ein Vektor ist, z.B. C{row, col} = ... oder A_3D(row, col, :) = ...
end
end


Generelle Empfehlung: Beschreibungen, was Code macht, sollten im Code als Kommentare enthalten sein.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Kathicita
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 20.09.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.04.2020, 04:51     Titel:
  Antworten mit Zitat      
Hallo
Zitat:

Zitat:
Hier ist das Problem, dass die Tage in 5-Jahres Abschnitten gezählt werden und somit nicht direkt maxk(Matrix, 10, 3) angewendet werden kann. Hier kommen zwar die Tageszahlen heraus, allerdings ist nicht klar, aus welchem Zeitabschnitt die Tagesnummer stammt.

Das sollte sich eigentlich hinbekommen lassen.


Hast du da zufällig eine Idee?

Ich habe das mit dem Loop einmal versucht, bekomme aber leider folgende Fehlermeldung:

Code:
Error using datetime/horzcat (line 1334)
All inputs must be datetimes or date/time character vectors or date/time strings.


Finde den Fehler allerdings nicht alleine, weiß nicht, wo genau hier der Fehler auftritt, bzw. wie er revidiert werden könnte.

Der Code sieht wie folgt aus:
Code:
CNRM_prhmax_1970_2005_T10_Val=[]
CNRM_prhmax_1970_2005_T10_Dates=[]
for row = 1:size(CNRM_prhmax_1970_2005_T_matrix, 1);
  for col = 1:size(CNRM_prhmax_1970_2005_T_matrix, 2);
      % for max 72 values
      CNRM_prhmax_1970_2005_T72_r_c = CNRM_prhmax_1970_2005_T_matrix(row, col);
      % into column
      CNRM_prhmax_1970_2005_T72_r_c_c= CNRM_prhmax_1970_2005_T72_r_c(:);
      % for datetime for max 72 values (T2/T10)
      CNRM_prhmax_1970_2005_T72_r_c = CNRM_prhmax_1970_2005_T_Date_matrix (row, col);
      % into column
      CNRM_prhmax_1970_2005_T72_r_c_c= CNRM_prhmax_1970_2005_T72_r_c(:);
      % split datetime
      [y,m,d] = ymd(CNRM_prhmax_1970_2005_T72_r_c_c);
      % Matrix T72 Values, Y,M,D
      CNRM_prhmax_1970_2005_T72_r_c_m= [CNRM_prhmax_1970_2005_T72_r_c,y,m,d];
      % now to get out Top 10 values with their Y,M,D
      CNRM_prhmax_1970_2005_T10_r_c_max=maxk(CNRM_prhmax_1970_2005_T72_r_c_m, 10, 1);
      % Top 10 values per pixel
      CNRM_prhmax_1970_2005_T10_r_c_Value=CNRM_prhmax_1970_2005_T10_r_c_max(:,1);
      % convert Y,M,D into datetime
      CNRM_prhmax_1970_2005_T10_r_c_Year=CNRM_prhmax_1970_2005_T10_r_c_max(:,2);
      CNRM_prhmax_1970_2005_T10_r_c_Month=CNRM_prhmax_1970_2005_T10_r_c_max(:,3);
      CNRM_prhmax_1970_2005_T10_r_c_Day=CNRM_prhmax_1970_2005_T10_r_c_max(:,4);
      CNRM_prhmax_1970_2005_T10_r_c_Date= datetime(CNRM_prhmax_1970_2005_T10_r_c_Year, ...
          CNRM_prhmax_1970_2005_T10_r_c_Month, CNRM_prhmax_1970_2005_T10_r_c_Day);

      % save 2 matrices, 1st with Top 10 values in 3rd dimension, 2nd with Top 10
      % datetimes in 3rd dimension (first and second dimension: latitude
      % and longitude)
      CNRM_prhmax_1970_2005_T10_Val=[CNRM_prhmax_1970_2005_T10; [CNRM_prhmax_1970_2005_T10_r_c_Value]]
      CNRM_prhmax_1970_2005_T10_Dates=[CNRM_prhmax_1970_2005_T10_Dates;[CNRM_prhmax_1970_2005_T10_r_c_Date]]
  end
end


Ich bin mir hier besonders im letzten Schritt unsicher, beim Speichern der generierten Daten.
Ich bräuchte am Ende eine 3D Matrix, in der in der dritten Dimension die Top 10 Niederschlagswerte für jeden Pixel drin sind und eine 3D Matrix, in der die Tage der Top 10 Niederschlagswerte in der dritten Dimension sind.

Hat vielleicht jemand einen Tipp für mich?

Liebe Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Hast du da zufällig eine Idee?

Das ganze ist etwas zu aufwändig als dass ich hier auf die Schnelle komplett durchblicke. Startpunkt ist auf jeden Fall das zweite Rückgabeargument von maxk. Ob und was du mit dieser Information noch machen musst, sehe ich nicht.

Bitte bei Fehlermeldungen immer angeben, in welcher Codezeile sie aufgetreten sind. Meine Vermutung ist, dass das Problem die Initialisierung ist. Versuch's mal mit
Code:
CNRM_prhmax_1970_2005_T10_Dates = datetime.empty


Alternativ solltest du auch auf der linken Seite von = die Ansätze mit (row, col) verwenden können.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Kathicita
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 20.09.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.04.2020, 12:55     Titel:
  Antworten mit Zitat      
Lieber Harald,

ganz lieben Dank dir!
Mit deinem Tipp hat es jetzt funktioniert und ich habe das gewünschte Ergebnis erhalten.

Liebe Grüße
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.