jetzt hab ich leider ein neues Problem. Die figure wird erstellt und zu sehen ist eine Linie, die ziemlich viele maximas und minimas hat. Also sie verläuft "Zickzack" mäßig. Mein Ziel ist es die x und y Werte der besonders rausstechenden maximas zu finden. Wie kann man das am besten lösen?
ich habe es mal mit max() ausporbiert, aber da zeigt er mir nur den allerhöchsten Punkt an.
Hat einer eine Idee, wie man dieses Problem lösen könnte? Ich habe schon auf anderen Seiten geschaut, allerdings konnte ich da die Lösungen nicht nachvollziehen, bzw, sie klappten dann auch nicht.
unter Umständen kannst du auch mit der funktion findpeaks durchaus etwas anfangen. Da gibt es auch die Option, nur die Peaks ab einer bestimmten Höhe abzufangen. Wenn deine Kurve schön zackig läuft, wie Du es beschrieben hast, wirst du alle Peaks (Maxima) finden und kannst die größten heraussuchen.
Hallo,
das steht eigentlich alles in der Hilfe zu findpeaks. Wenn in y deine y-Werte stehen und in x deine x-Werte, dann findest du die passenden Werte mit
findpeaks ist Teil der Signal Processing Toolbox. Es scheint so, als hättest Du keinen Zugriff auf diese Toolbox.
Dann kannst du das wohl nicht mit findpeaks lösen.
pariser
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.05.2013, 01:44
Titel:
gibt es auch funktionen die so die gleiche funktionalität anbieten?
Du kannst dir mit Mmmartinas Vorschlag soetwas ähnliches schnell selbst zusammenbasteln. Die Idee hierbei ist: Vorzeichenwechsel von + nach - in der Differenz zweier aufeinanderfolgenden Werte bedeuten einen Peak. Anschaulich: bis dahin steigt die zugehörige Kurve an (Differenzen > größer 0), dann ist ein Maximum erreicht und die Funktion fällt wieder (Differenzen < 0).
Das könnte in etwa so aussehen:
Code:
y = [2,4,5,8,5,4,4,3,6,5,3,5,6,7,9,3,3];
x = linspace(0,1,length(y));
% peaks sind Vorzeichenwechsel von + nach - der Differenzen
d = [0, diff(y)];
d_pos = d>0;
d_neg = d<0;
pos_pks = d_pos(1:end-1) & d_neg(2:end);
% Plot figure() plot(x,y) hold on
plot(x(pos_pks), y(pos_pks), 'k^', 'MarkerFaceColor','red')
Wenn du nun "besonders hervostechende Peaks" suchst, musst du das noch genauer beschreiben, was du nun von den gefundenen Peaks herausschmeißen willst und was du behalten willst. Soetwas wie "ich nehme nur Peaks mit Werten > 5" ist dann sehr leicht zu implementieren. Ebenso wäre es denkbar zu sagen, "ein besonderer Peak ist ein Peak, der mit einem Abstand von a Stellen nach links und rechts keinen Nachbarpeak hat". Oder eben auch Kombinationen der beiden Ideen oder noch ganz andere Ideen. Das ist dann dir überlassen.
Viele Grüße,
Nras.
pariser
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.05.2013, 17:49
Titel:
y = [2,4,5,8,5,4,4,3,-10,5,3,5,6,7,9,3,3];
wie fange ich noch negative peaks... beispielsweise die in der mitte ingeführte -10 ??
Was mich noch interessiert ist, dass
pariser
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.05.2013, 17:56
Titel:
noch eine weitere Frage ist die Lösung
peaks = (abs(diff(data)) > konstante);
efektiver als dein Code-Vorschlag bzw. wo ist der unterschied ?..
Deine Methode gibt dir nur die größte Steigung an.
z.B. bei
y = [1, 1.5, 1.7, 5, 6, 6.5, 6.7];
da ist die größte Differenz zwischen der 1.7 und der 5. Trotzdem steigt der Graph die ganze Zeit an und hat kein Maximum (außer am rechten Rand).
Viele Grüße,
Nras.
pariser
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.05.2013, 18:37
Titel:
Eine weitere Frage hätte ich noch, wie könnte ich jetzt die gefundene Peaks beispielsweise mit NaNs ersetzen
pariser
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.05.2013, 18:43
Titel:
Ich habe eben gerade mal was getestet:
ich habe dein code mit dem folgendem Vector ausprobiert
y = [2,4,5,8,-10,8,4,3,-10,5,3,5,6,7,9,3,3];
Nun ist die Position 4 5 6 als Peaks dargestellt...
kann man noch dein code erweitern und sagen, falls die Steigung größer als eine Konstante (Steigung) ist, soll es als Peaks identifiziert werden (abs(diff(y)) > konstante);
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.