Verfasst am: 27.04.2020, 11:32
Titel: Loop bei 3D Matrix anwenden
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(:);
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
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?
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 ;)
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:
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.
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
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 ;)
ganz lieben Dank dir!
Mit deinem Tipp hat es jetzt funktioniert und ich habe das gewünschte Ergebnis erhalten.
Liebe Grüße
Einstellungen und Berechtigungen
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
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.