Verfasst am: 28.09.2013, 14:30
Titel: Zahlen addieren bis null kommt
Hallo,
für meine Thesis muss ich mit Matlab arbeiten und da habe ich folgendes Problem.
Ich habe zwei Reihen an Zahlen, die zweite Reihe sind Messwerte von Niederschlägen. Die möchte ich jetzt zu Regenereignissen zusammenfassen. Sprich, alle Zahlen größer null sollen aufaddiert werden, bis wieder eine Null kommt.
Hier mal ein Beispiel. Die dritte Spalte habe ich jetzt manuell gemacht. Da ich aber millionen Daten habe, müsste ich mir die von Matlab erstellen lassen. Geht das und wenn ja wie?!
den index der nullen mittels find ermitteln und dann mittels forschleife die bereiche durchlaufen und die summen bilden. wenn die blöcke immer gleich lang sind würde es noch einfacher mit reshape und sum laufen.
_________________
Welches Format soll die Ausgabe haben? Die Schreibweise mit den Minus-Zeichen ist nicht klar, valide Matlab-Syntax ist in einem Matlab-Forum viel besser. Wozu dient die erste Spalte?
Was hast Du bisher versucht und was machte dabei Schwierigkeiten?
Was besseres als eine Schleife fällt mir auch nicht ein.
Angenommen A ist deine Matrix. Spalte 1 ist das Date, Spalte 2 ist 0 oder eine Zahl Größer als Null die du blockweise summieren möchtest.
Code:
temp=0;
for z=1:size(A,1)% laufe die Matrize durch. if A(z,2)>0% Wenn in Spalte 2 eine Zahl größer als 0 steht
temp=A(z,2)+temp; % Fange an diese Zahlen zu addieren else% Wenn in Spalte 2 die Zahl gleich Null ist if temp>0% Überprüfe ob temp größer als Null ist, wenn ja, ist ein (Regen)Block gerade beendet worden
A(z-1,3)=temp; % Dann schreibe die Summe in die dritte Spalte ans Ende des Blocks
temp=0; % Danach können wir unsere temporäreVariable wieder löschen. end
Solange du das nur ein oder zweimal machen musst kannst du meiner Meinung nach ruhig alles einmal durchlaufen. Der JIT Compiler sollte da auch leichtes spiel haben.
Ansonsten wie Winkow vorgeschlagen hat, nur den Index der Blöcke extrahieren und nur auf diese Indeizes dann durchlaufen. Dort musst du halt nur darauf achten, wann die Indizel einen Sprung > 1 machen. Dort ist dann ein Block zuende (falls dir das nicht klar gewesen sein soll).
_________________
Vielen vielen Dank für eure Antworten.
Insbesondere dir Markuman! Der Test hat perfekt geklappt. Und das obwohl Matlab komplettes Neuland für mich ist. Jetzt werde ich das mal auf meine Daten anwenden. Das sind Daten von 20 Jahren und das im Minutentakt, das hätte ich unmöglich alles manuell machen können.
Super!! Danke nochmal.
Und schönen Sonntag noch...
Verfasst am: 07.11.2013, 15:45
Titel: Fehler wenn der letzten block bis ans Ende der Matrix reicht
@sirius3
ich habe deinen Code ausprobiert, und klappt auch eigentlich wunderbar. Jedoch ist mir aufgefallen, dass ich eine Fehlermeldung bekomme wenn ein Regenblock bis an das Ende einer Matrix reicht. Irgendwie kann die diff- Funktion dann das Ende nicht mehr feststellen.
Hast du ne Idee wie man das umgehen kann?
Viele gruesse Martin
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.