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

Extremwerte finden

 

Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 19.05.2013, 19:47     Titel:
  Antworten mit Zitat      
Ich glaube, ich versteh dich nun nicht wirklich richtig, aber mit d(pos_pks) kommst du an die Differenz an den erkannten Peaks.
Wenn du nun aus den erkannten Peaks nur diejenigen willst, die (in der Richtung von links nach rechts) sehr steil sind, kommst du vielleicht damit weiter:

Code:
konstante = 10;
pos_pks_filtered = pos_pks(abs(d(pos_pks)) > konstante);


Falls beide Richtungen (von links und von rechts) steil sein sollen, müsstest du eben auch die Differenz d an den Stellen pos_pks + 1 anschauen und testen. Das kriegst du sicher selbst hin. (Achtung beim Rand).
Private Nachricht senden Benutzer-Profile anzeigen


pariser

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2013, 23:13     Titel:
  Antworten mit Zitat      
Code:
, müsstest du eben auch die Differenz d an den Stellen pos_pks + 1 anschauen und testen. Das kriegst du sicher selbst hin. (Achtung beim Rand).



Leider tue ich mich da schwer, habs irgendwie nicht hinbekommen. Könntest du vielleicht den oben zitierten teil auch in dein Code-Vorschlag einbauen.

Du hast es richtig gelöst. Es sollen nur die Peaks erkannt werden, die in der Richtung von links nach rechts sehr steil sind
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 19.05.2013, 23:35     Titel:
  Antworten mit Zitat      
Wenn das nur von links nach rechts steil sein soll, dann bist du schon fertig.

Aber Achtung, da ich mich nun halbwegs hierfür verantwortlich fühle, solltest du beachten, dass das diff(data) nur proportional zur Steigung ist, wenn die zugehörigen X-Werte äquidistant sind, denn nur dann reicht es, die Zähler (also Differenzen der Y-Werte) zu betrachten. Sind deine zugehörigen X-Werte nicht äquidistant müsstest du immer das Verhältnis diff(y) zu diff(x) betrachten, um wirklich Steigungen zu kriegen.

Kleines Beispiel:
Code:
y = [1,2,3,2,2,5,4,3,4];
x = [1,2,2.1,3,4,7,8.5,9,10];
figure
plot(x,y,'o-')

Es wäre falsch, hier nur die Differenzen der y-Werte zu betrachten, denn der Sprung vom Punkt (2,2) auf den Punkt (2.1, 3) ist viel Steiler als der Sprung vom Punkt (4,2) auf (7,5), obwohl die Differenz der Y-Werte für den ersten Sprung "nur" 1 beträgt und für den zweiten Sprung 3.

Die Steigung wäre beim ersten Sprung nämlich (3-2)/(2.1-2) = 1/0.1 = 10 und beim zweiten Sprung (5-2)/(7-4) = 3/3 = 1.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
pariser

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2013, 23:44     Titel:
  Antworten mit Zitat      
Meine Daten sind äquidistant, also in einem konstanten Abstand. Danke nochmal für den Hinweis

Ich würd mich auf jeden Fall freuen, wenn du das letzte Gewünschte noch in dein Code-Vorschlag einbauen könntest?

Viele Grüße,
Paris
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 20.05.2013, 09:19     Titel:
  Antworten mit Zitat      
Ich würde mich freuen, wenn du das selber versuchen würdest.

Was hast du versucht und was bekommst du für ein Ergebnis bzw. für eine Fehlermeldung?

Und noch mal, wenn das nur von links steil ssein soll, dann brauchst du die Differenzen rechts von Peak (also an den Stellen pos_pks + 1) nicht zu betrachten.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
pariser

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2013, 19:03     Titel:
  Antworten mit Zitat      
Code:
x = linspace(0,1,length(y));

% peaks sind Vorzeichenwechsel Differenzen
d = [0, diff(y)];
d_pos = d>0;
d_neg = d<0;
isPositivePeak = d_pos(1:end-1) & d_neg(2:end);
isNegativePeak = d_neg(1:end-1) & d_pos(2:end);
pos_pks = find(isPositivePeak | isNegativePeak);
konstante = 10;

pos_pks = pos_pks(abs(d(pos_pks)) > konstante) & (pos_pks(abs(d(pos_pks+1)) > konstante))
 
pariser

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2013, 19:04     Titel:
  Antworten mit Zitat      
Ich wüprde gerne ausprobieren, ob die die Differenzen rechts von Peak (also an den Stellen pos_pks + 1) zu fangen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 20.05.2013, 20:37     Titel:
  Antworten mit Zitat      
Hallo,

da passt nur was mit den Klammern nicht.
Du möchtes salopp gesprochen: pos_pks(gültige Indizes), das heißt in den Klammern gehört ein logischer Ausdruck, etwa so:
Code:
pos_pks = pos_pks(abs(d(pos_pks)) > konstante & abs(d(pos_pks+1)) > konstante);


Oder etwas nachvollziehbarer:
Code:

isLinksSteil = abs(d(pos_pks)) > konstante;
isRechtsSteil = abs(d(pos_pks+1)) > konstante;
pos_pks_filtered = pos_pks(isLinksSteil & isRechtsSteil)


So sollte es passen.
Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
pariser

Gast


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

könntest du bitte das folgende Beispiel testen:
Da ist immer noch was komisch, habs net lösen können!
Irgendwie wird alles als Peak detektiert.

Code:
y = [ 1 2 3 5 1 2 5 4 8 5 6 9 5 2 0 324 465 46 546 54 6984 66 846 54 621 65 46 546 51 646 54436 551 ];
konstante = 0;
d = [0, diff(y)];
d_pos = d>0;
d_neg = d<0;
isPositivePeak = d_pos(1:end-1) & d_neg(2:end);
isNegativePeak = d_neg(1:end-1) & d_pos(2:end);
pos_pks = find(isPositivePeak | isNegativePeak);

isLinksSteil = abs(d(pos_pks)) >= konstante;
isRechtsSteil = abs(d(pos_pks+1)) >= konstante;
pos_pks_filtered = pos_pks(isLinksSteil & isRechtsSteil)

y = data;
x = linspace(0,1,length(data));
% Plot
plot(x,data)
hold on
plot(x(pos_pks_filtered), y(pos_pks_filtered), 'k^', 'MarkerFaceColor','red')


Zitat:
%
% pos_pks_filtered =
%
% Columns 1 through 15
%
% 4 5 7 8 9 10 12 15 17 18 19 20 21 22 23
%
% Columns 16 through 21
%
% 24 25 27 28 29 31
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 21.05.2013, 17:31     Titel:
  Antworten mit Zitat      
Hallo,

das Skript läuft so bei mir nicht durch. Meinst du in Zeile 14 data = y; statt y = data? data ist bis dahin nämlich gar nicht bekannt.

Ich glaube, du hast bloß das Prinzip noch nicht wirklich verstanden. Das funktioniert sonst alles genau so, wie es soll. Alle Peaks sind von links und von rechts Steil. Deine Konstanste setzt du 0, damit ist per Definition jeder Peak "steil".
Der große Vorteil von solchen Variablen wie "isLinksSteil" bzw. "isRechtsSteil" ist neben der Lesbarkeit auch, dass du sie dir mal ansehen kannst. Dann würdest du sehen, dass dort überall einsen stehen, es also für jeden Peak wahr ist, dass sie linkssteil bzw. rechtssteil sind.

Du müsstest deine Konstante also (viel) größer Wählen, damit einige der Peaks rausfallen. Bei den Daten könnte man vielleicht (aus der Luft gegriffen) konstante = 500 setzen, dann werden einige der Peaks weggefiltert.

Zum Beispiel:
Code:
y = [ 1 2 3 5 1 2 5 4 8 5 6 9 5 2 0 324 465 46 546 54 6984 66 846 54 621 65 46 546 51 646 54436 551 ];
konstante = 500;
d = [0, diff(y)];
d_pos = d>0;
d_neg = d<0;
isPositivePeak = d_pos(1:end-1) & d_neg(2:end);
isNegativePeak = d_neg(1:end-1) & d_pos(2:end);
pos_pks = find(isPositivePeak | isNegativePeak);

isLinksSteil = abs(d(pos_pks)) >= konstante;
isRechtsSteil = abs(d(pos_pks+1)) >= konstante;
pos_pks_filtered = pos_pks(isLinksSteil & isRechtsSteil)

data = y; % Wieso auch immer.
x = linspace(0,1,length(data));
% Plot
figure
plot(x,data)
hold on
plot(x(pos_pks_filtered), y(pos_pks_filtered), 'k^', 'MarkerFaceColor','red')


Viele Grüße,
Nras
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.