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

Anzahl und Dauer bei Überschreitung eines Schwellenwerts

 

Phippu

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2014, 15:42     Titel: Anzahl und Dauer bei Überschreitung eines Schwellenwerts
  Antworten mit Zitat      
Hallo zusammen

Bin gerade daran, Abflussdaten auszuwerten. Mein Interesse liegt dabei an den Werten, die einen bestimmten Schwellenwert überschreiten.

Mein Programm soll die Anzahl und vor allem die Dauer von Abflussereignissen über dem Schwellenwert angeben.

Bsp: Schwellenwert: 150

Vektor A=[3 5 9 40 50 90 139 151 135 158 160 120 90 10]

Die fetten Werte überschreiten den Schwellenwert. Dies soll jetzt als zwei Ereignisse ausgegeben werden, mit der Dauer 1 und Dauer 2.
Dies möchte ich für mehrere Jahre auswerten (darum die for-Schleife)!
Mein jetziger Code sieht wie folgt aus:

Code:
for i = Anfang:Einfluss_Damm-1 %Zeitspanne, die untersucht werden soll    
    idxi = find(date_d_year == i); %Finden des entsprechenden Jahres in den Gesamtdaten
    idxj = find(Qbd(idxi)>=threshold_high); %Finden der Elemente pro Jahr wo der Schwellenwert erreicht wird
    idxy = idxi(idxj);
    Zeitpunkte_Treshold_High=Zeitreihe(idxy); %Ausgabe des Datums (in Matlabzeit)
    Dauer_s=diff(Zeitpunkte_Treshold_High); %Berechnung der Dauer zwischen zwei Ereignissen
    Dauer_z=Dauer_s';
    if length(Zeitpunkte_Treshold_High)==0 %Kein Überschreiten des Schwellenwerts --> Dauer = 0!
        Dauer_Threshold_High_Jahr(i-(Anfang-1))=0;
    elseif length(Zeitpunkte_Treshold_High)==1 %einmaliges Überschreiten --> Dauer = 1
        Dauer_Threshold_High_Jahr(i-(Anfang-1))=1;
    else
    if  all(Dauer_z~=1)
        numberOfRegions=numel(Dauer_z);
        Dauer_Threshold_High_Jahr(i-(Anfang-1))=1;
    elseif length(Dauer_z)==1 && Dauer_z(1)==1
        Dauer_Threshold_High_Jahr(i-(Anfang-1))=2;
    else
        [labeledData, numberOfRegions] = label(Dauer_z);
        [val,dummy,pos]=unique(labeledData);
        [num]=histc(pos,1:length(val));
   
    Dauer_Threshold_High_Jahr(i-(Anfang-1))=mean(num); %Mittelwertbildung pro Jahr (beachte: funktioniert nicht!)
    end
    end
end


Der Code funktioniert leider noch nicht wie gewünscht! Hat jemand eine Idee, wie ich dieses Problem lösen könnte? Habe schon diverse andere Einträge konsultiert, aber noch keine springende Idee gehabt.

Um Hinweise wäre ich sehr froh. Grüsse Phippu


mats
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 16.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2014, 15:59     Titel:
  Antworten mit Zitat      
Bevor ich dir richtig helfen kann habe ich eine Frage zu deiner Datenstruktur. Qbd ist deine Matrix, in der fuer jedes Jahr die Abflussdaten stehen? Oder ist das eine cell struktur? Wenn es ne Matrix ist und idxi eine einzelne Zahl als Jahresindex, dann wird Qbd(idxi) doch gar nicht den ganzen Abflussvektor liefern, sondern nur einen einzelnen Datenpunkt. Muesstest du dann nicht eher Qbd(idxi,Smile oder Qbd(:,idxi) je nach Datenstruktur untersuchen?
Oder ist Qbd ne cell, dann muesste der Aufruf Qbd{idxi} sein statt Qbd(idxi).
Private Nachricht senden Benutzer-Profile anzeigen
 
Phippu

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2014, 16:06     Titel:
  Antworten mit Zitat      
Hallo mats

Qbd ist mein Vektor wo ich die Abflussmesswerte gespeichert habe.
z.B.

Index Wert
1 3.47000000000000
2 3.47000000000000
3 3.47000000000000
4 3.06000000000000
5 3.06000000000000
6 3.34000000000000
7 6.82000000000000
8 4.45000000000000
9 3.06000000000000
10 ...

Ich werte nach den Jahren aus, suche mir dazu den passenden Index aus dem Datumvektor raus und suche dann die passenden Werte dazu im Qbd. Dies kann sicher auch einfacher gehen, bin gar kein Spezialist.
Hilft dies weiter?

Danke schonmals, gruess Phippu
 
mats
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 16.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2014, 16:12     Titel:
  Antworten mit Zitat      
Was ich meinte betrifft diese Zeile aus deinem Code:

idxj = find(Qbd(idxi)>=threshold_high);

So wie es da steht, schaust du ja nur an einer einzigen Stelle des Vektors Qbd nach, ob der threshold_high ueberschritten wird. So wie ich dich verstehe, willst du ja aber alle Werte von Qbd finden, die diesen Wert ueberschreiten. Dann solltest du doch eher das hier schreiben:

idxj = find(Qbd>=threshold_high);

Hast du denn in jedem Jahr mehrere Abflussratenwerte oder nur genau einen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Phippu

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.10.2014, 21:46     Titel:
  Antworten mit Zitat      
Sorry, war hier ein wenig unklar. Ich habe 365 Werte pro Jahr, also tägliche Abflussmessungen. Diese rufe ich mit meinem Code auf. Das klappt auch, habe dies verifiziert. Das Problem ist nur ab dann, wenn ich unten die Zeitpunkte rausgeschrieben habe, an denen der Schwellenwert überschritten wird. Da komme ich nicht mehr weiter.

Danke schon mals und hoffe auf weitere Inputs.
Grüsse, Phippu
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 17.10.2014, 07:42     Titel:
  Antworten mit Zitat      
Hallo,

mal unabhängig von deinem Code und nur auf dein anfängliches Beispiel bezogen: Die Anzahl und die Länge der Überschreitungen kannst du ganz ohne Schleife finden. Dazu kannst du die runlength-codierung benutzen.
Code:
A=[3 5 9 40 50 90 139 151 135 158 160 120 90 10] ;
crit = 150;

x = A>crit; % Überschreitungen sind nun Einser-Cluster getrennt von Nullen.
% Ziel ist jetzt: Anzahl und Länge der Einser-Cluster zu bestimmen

% Runlength encoding (von Jan S. http://www.mathworks.com/matlabcent.....h/content//RunLength_M.m)
d = [true, diff(x) ~= 0];   % TRUE if values change
b = x(d);                   % Elements without repetitions
k = find([d, true]);        % Indices of changes
n = diff(k);                % Number of repetitions

% Wir wollen nur die längen der Einser-Serien wissen
i = find(b==1);
anzahl = length(i); % Anzahl der Ereignisse: 2
dauer = n(i); % Länge der jeweiligen Ereignisse: 1, 2


Damit kommst du vielleicht weiter.

viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Phippu

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.10.2014, 09:42     Titel:
  Antworten mit Zitat      
Hallo Nras

Das war genau das, was ich gesucht habe! Super. Habe das gerade eingebaut und es macht jetzt genau das, was ich haben wollte.
Vielen herzlichen Dank!

Für Interessierte hier noch der Code:

Code:
for i = Anfang:Einfluss_Damm-1 %Zeitspanne, die untersucht werden soll
    idxi = find(date_d_year == i); %Finden des entsprechenden Jahres in den Gesamtdaten
    Grenzwert_2high=Qbd(idxi)>=threshold_high; %Prüfen, ob Werte im Jahr über dem Grenzwert liegen.
    x = Grenzwert_2high';
 
    d = [true, diff(x) ~= 0];   % TRUE if values change
b = x(d);                   % Elements without repetitions
k = find([d, true]);        % Indices of changes
n = diff(k);                % Number of repetitions

% Wir wollen nur die längen der Einser-Serien wissen
j = find(b==1);
anzahl = length(j); % Anzahl der Ereignisse
dauer = n(j); % Länge der jeweiligen Ereignisse
if anzahl==0
    Dauer_Threshold_High_Jahr(i-(Anfang-1))=0;
else
Dauer_Threshold_High_Jahr(i-(Anfang-1))=mean(dauer);
end
end


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