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

Zahlen addieren bis null kommt

 

Carolin-th

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2013, 14:30     Titel: Zahlen addieren bis null kommt
  Antworten mit Zitat      
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?!

Wäre so dankbar für Hilfe!!

Date - discharge - Zu erstellen
1 - 0
2 - 0
3 - 4 - 15
4 - 3
5 - 2
6 - 6
7 - 0
8 - 0
9 - 0
10 - 5 - 12
11 - 4
12 - 3
13 - 0
14 - 2 - 7
15 - 3
16 - 2
17 - 0
18 - 0
19 - 0
20 - 0

Liebe Grüße Carolin


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.09.2013, 14:46     Titel:
  Antworten mit Zitat      
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.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.09.2013, 19:17     Titel: Re: Zahlen addieren bis null kommt
  Antworten mit Zitat      
Hallo Carolin-th,

Mir wird die Bedeutung der Zahlen noch nicht klar.
Zitat:
Sprich, alle Zahlen größer null sollen aufaddiert werden, bis wieder eine Null kommt.

Date - discharge - Zu erstellen
1 - 0
2 - 0
3 - 4 - 15
4 - 3
5 - 2
6 - 6
7 - 0
8 - 0
9 - 0
10 - 5 - 12...

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?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 29.09.2013, 09:00     Titel:
  Antworten mit Zitat      
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
 
  end
end
 


Vorausgehend zum Testen:
Code:

A(:,1)=1:100;
A(:,2)=0;
A(13:24,2)=rand;
A(54:57,2)=rand;
A(87:93,2)=rand;
% ups, looks like NSA randrom Very Happy
% aber zum testen reicht es.
 


Sieht anschließend hier dann so aus:

Code:

octave:21> A
A =

     1.00000     0.00000     0.00000
     2.00000     0.00000     0.00000
     3.00000     0.00000     0.00000
     4.00000     0.00000     0.00000
     5.00000     0.00000     0.00000
     6.00000     0.00000     0.00000
     7.00000     0.00000     0.00000
     8.00000     0.00000     0.00000
     9.00000     0.00000     0.00000
    10.00000     0.00000     0.00000
    11.00000     0.00000     0.00000
    12.00000     0.00000     0.00000
    13.00000     0.15964     0.00000
    14.00000     0.15964     0.00000
    15.00000     0.15964     0.00000
    16.00000     0.15964     0.00000
    17.00000     0.15964     0.00000
    18.00000     0.15964     0.00000
    19.00000     0.15964     0.00000
    20.00000     0.15964     0.00000
    21.00000     0.15964     0.00000
    22.00000     0.15964     0.00000
    23.00000     0.15964     0.00000
    24.00000     0.15964     1.91564
    25.00000     0.00000     0.00000
    26.00000     0.00000     0.00000
    27.00000     0.00000     0.00000
    28.00000     0.00000     0.00000
    29.00000     0.00000     0.00000
    30.00000     0.00000     0.00000
    31.00000     0.00000     0.00000
    32.00000     0.00000     0.00000
    33.00000     0.00000     0.00000
    34.00000     0.00000     0.00000
    35.00000     0.00000     0.00000
    36.00000     0.00000     0.00000
    37.00000     0.00000     0.00000
    38.00000     0.00000     0.00000
    39.00000     0.00000     0.00000
    40.00000     0.00000     0.00000
    41.00000     0.00000     0.00000
    42.00000     0.00000     0.00000
    43.00000     0.00000     0.00000
    44.00000     0.00000     0.00000
    45.00000     0.00000     0.00000
    46.00000     0.00000     0.00000
    47.00000     0.00000     0.00000
    48.00000     0.00000     0.00000
    49.00000     0.00000     0.00000
    50.00000     0.00000     0.00000
    51.00000     0.00000     0.00000
    52.00000     0.00000     0.00000
    53.00000     0.00000     0.00000
    54.00000     0.80325     0.00000
    55.00000     0.80325     0.00000
    56.00000     0.80325     0.00000
    57.00000     0.80325     3.21298
    58.00000     0.00000     0.00000
    59.00000     0.00000     0.00000
    60.00000     0.00000     0.00000
    61.00000     0.00000     0.00000
    62.00000     0.00000     0.00000
    63.00000     0.00000     0.00000
    64.00000     0.00000     0.00000
    65.00000     0.00000     0.00000
    66.00000     0.00000     0.00000
    67.00000     0.00000     0.00000
    68.00000     0.00000     0.00000
    69.00000     0.00000     0.00000
    70.00000     0.00000     0.00000
    71.00000     0.00000     0.00000
    72.00000     0.00000     0.00000
    73.00000     0.00000     0.00000
    74.00000     0.00000     0.00000
    75.00000     0.00000     0.00000
    76.00000     0.00000     0.00000
    77.00000     0.00000     0.00000
    78.00000     0.00000     0.00000
    79.00000     0.00000     0.00000
    80.00000     0.00000     0.00000
    81.00000     0.00000     0.00000
    82.00000     0.00000     0.00000
    83.00000     0.00000     0.00000
    84.00000     0.00000     0.00000
    85.00000     0.00000     0.00000
    86.00000     0.00000     0.00000
    87.00000     0.90748     0.00000
    88.00000     0.90748     0.00000
    89.00000     0.90748     0.00000
    90.00000     0.90748     0.00000
    91.00000     0.90748     0.00000
    92.00000     0.90748     0.00000
    93.00000     0.90748     6.35234
    94.00000     0.00000     0.00000
    95.00000     0.00000     0.00000
    96.00000     0.00000     0.00000
    97.00000     0.00000     0.00000
    98.00000     0.00000     0.00000
    99.00000     0.00000     0.00000
   100.00000     0.00000     0.00000
 


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).
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Carolin-th

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2013, 12:22     Titel: Danke
  Antworten mit Zitat      
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...
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2013, 13:10     Titel:
  Antworten mit Zitat      
ohne for-Schleife, dafür mit Start- und Enddatum:
Code:
A(:,1)=1:100;
A(:,2)=0;
A(13:24,2)=rand;
A(54:57,2)=rand;
A(87:93,2)=rand;

B=reshape(find(diff(A(:,2)==0)),2,[]);
C(:,1) = A(B(1,:)+1,1);  % Startdatum
C(:,2) = A(B(2,:),1);      % Enddatum
C(:,3) = arrayfun(@(i)sum(A(B(1,i):B(2,i),2)), 1:size(B,2)); % Summe
 
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 29.09.2013, 14:34     Titel:
  Antworten mit Zitat      
Sirius3 hat Folgendes geschrieben:
ohne for-Schleife, dafür mit Start- und Enddatum:
Code:
A(:,1)=1:100;
A(:,2)=0;
A(13:24,2)=rand;
A(54:57,2)=rand;
A(87:93,2)=rand;

B=reshape(find(diff(A(:,2)==0)),2,[]);
C(:,1) = A(B(1,:)+1,1);  % Startdatum
C(:,2) = A(B(2,:),1);      % Enddatum
C(:,3) = arrayfun(@(i)sum(A(B(1,i):B(2,i),2)), 1:size(B,2)); % Summe
 


Ach das mit reshape ist ja nice. Da wäre ich so nicht drauf gekommen.
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Martin_Trondheim

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2013, 15:45     Titel: Fehler wenn der letzten block bis ans Ende der Matrix reicht
  Antworten mit Zitat      
@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
 
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.