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

Messwerte zusammenfassen

 

Gast12

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2018, 20:27     Titel: Messwerte zusammenfassen
  Antworten mit Zitat      
Hallo zusammen,

ich bin MATLAB "Anfänger" und stehe auf dem Schlauch. Ich bringe meine Anweisung einfach nicht fertig. Ich hoffe jemand kann mir mit meiner Frage helfen.

Ich habe eine Reihe von Messwerten. In der ersten Spalte befindet sich das datum (in mathematischer MATLAB schreibweise) und in der zweiten spalte befinden sich die messwerte.

Hier ein Beispiel mit frei gewählten Zahlen:
Datum Messwert
1000, 0
1001, 1
1002, 3
1003, 1
1004, 0
1005, 0
1006, 4
1007, 0
1008, 0
1009, 0
1010, 0
1011, 1
1012, 1
1013, 2
1014, 3
1015, 1
1016, 1
1017, 0
1018, 0
1019, 0

Die Messwerte stellen Niederschlagsmessungen dar. Ich möchte nun herausfinden, wie viel Regen pro Ereignis auftritt, wie lange dieses Ereignis dauert und an welchem Datum es startet.

Meine Ziel matrix soll also sein (stimmt für die werte aus obenstehender matrix):
Summe AnzahlMesswerte Start
5, 3, 1001
4, 1, 1006
9, 6, 1011

Ich hab an eine for-schleife gedacht, die die messwerte durchläuft und realisiert wenn ein ereignis beginnt und fertig ist und dann die summe der messwerte bildet und die anzahl der messwerte des ereignisses berechnet und denn starttag. aber leider ist mir schlichtweg nicht klar wie ich das programmieren muss. oder gibt es da eine bessere lösung?

Vielen Dank für eure hilfe, Lucas


SigiSorglos
Forum-Century

Forum-Century


Beiträge: 147
Anmeldedatum: 24.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2018, 10:55     Titel:
  Antworten mit Zitat      
Der folgende Code sollte funktionieren:

Code:
clc
A=[1000, 0
1001, 1
1002, 3
1003, 1
1004, 0
1005, 0
1006, 4
1007, 0
1008, 0
1009, 0
1010, 0
1011, 1
1012, 1
1013, 2
1014, 3
1015, 1
1016, 1
1017, 0
1018, 0
1019, 0];

EreignisAktiv=0;
EreignisIdx=0;
Zielmatrix=zeros(1,3);

% Schleife durchläuft alle Messdaten
for f=1:length(A(:,1))
    % Prüfen, ob ein Niederschlag registriert wurde
   if A(f,2)~=0  
       % Prüfen ob der Niederschlag bereits zuvor aktiv war
       if EreignisAktiv==0
        EreignisIdx=EreignisIdx+1;
        Zielmatrix(EreignisIdx,3)=A(f,1); % zuweisen des Start Datums
       end
       EreignisAktiv=1;
       Zielmatrix(EreignisIdx,1)=Zielmatrix(EreignisIdx,1)+A(f,2);
       Zielmatrix(EreignisIdx,2)=Zielmatrix(EreignisIdx,2)+1;
   elseif A(f,2)==0 && EreignisAktiv==1    % Ereignis beenden, falls kein Niederschlag registriert wurde
       EreignisAktiv=0;
   end
end


Falls du Fragen dazu hast, melde dich einfach. Bringt ja nichts etwas zu kopieren aber nicht zu verstehen warum es funktioniert Wink
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: 09.01.2018, 11:35     Titel:
  Antworten mit Zitat      
Hallo,

eine alternative Herangehensweise:

Code:
anfang = find(A(2:end,2) > 0 & A(1:end-1,2) == 0) + 1;
if A(1,2) > 0
    anfang = [1; anfang];
end

ende = find(A(2:end,2) == 0 & A(1:end-1,2) > 0) + 1;
if A(end,2) > 0
    ende = [ende; size(A,1)];
end

dauer = ende - anfang;
summe = arrayfun(@(a, b) sum(A(a:b,2)), anfang, ende);

ergebnis = [summe, dauer, A(anfang,1)]


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast12

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2018, 19:55     Titel:
  Antworten mit Zitat      
Hallo SigiSorglos, Hoi Harald,

Merci für eure Vorschläge.

@SigiSorglos: ich kann deinen code nachvollziehen. ich werde versuchen diesen umzuschreiben damit er für eine beliebige zielmatrix funktioniert da ich nicht immer gleich lange messreihen habe.

@harald: dein code kann ich verstehen bis auf den "arrayfun(@..." befehl. hab gegooglet aber mir ist nicht ganz klar, was tut der mit a und b?

Ich habe noch eine Ergänzung gemacht. ich möchte die ereignisse unterschieden, sagen wir mal nach gewitter und regen. dazu habe ich die for-schleife (siehe code) erstellt. sie funktioniert zwar, aber geht das nicht eleganter/schöner programmiert? Rolling Eyes ich hab ein wenig bedenken dass dies bei langen messreihen zu viel rechenzeit benötigt?

Code:
anfang = find(A(2:end,2) > 0 & A(1:end-1,2) == 0) + 1;
if A(1,2) > 0
    anfang = [1; anfang];
end

ende = find(A(2:end,2) == 0 & A(1:end-1,2) > 0) + 1;
if A(end,2) > 0
    ende = [ende; size(A,1)];
end

dauer = ende - anfang;
summe = arrayfun(@(a, b) sum(A(a:b,2)), anfang, ende);

ergebnis = [summe, dauer, A(anfang,1)]

wertgewitter = 0;
wertregen = 0;
grenzwert = 3;

for i =1:size(anfang,1)
   
u = A(anfang(i,1):ende(i,1)-1,2);
v = max(u);

if v > grenzwert
    wertgewitter = wertgewitter + 1;
else
    wertregen = wertregen + 1;
end

end


Grüsse
 
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.