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

spaltenweise findpeaks in matrix

 

Schrank
Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 10.07.08
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 21.04.2009, 16:04     Titel: spaltenweise findpeaks in matrix
  Antworten mit Zitat      
Hallo,

ich versuche in einer 2D-Matrix spaltenweise die zwei größten lokalen Maxima zu finden. Bisher bin ich nur auf eine Lösung mit einer Schleife und
Code:
gekommen, kennt da jemand vielleicht eine elegantere Methode?

Grüße
Schrank
Private Nachricht senden Benutzer-Profile anzeigen


derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 21.04.2009, 16:41     Titel:
  Antworten mit Zitat      
Hi gute Frage mir fällt da auch nicht wirklich ne einfache Lösung ein. Die ersten Peaks könntest du ja mit max rausfinden von da ab gibts vielleicht noch ein paar performantere Lösungen. (Allerdings keine eleganteren). Zb könntest du die max. Werte, welche konsekutiv zu dem ersten Max wert sind so länge löschen, bis einer nicht konsekutiv ist, dass ist dann dein 2. Peak. Ist nur so ne Idee.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
Schrank
Themenstarter

Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 10.07.08
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 23.04.2009, 11:59     Titel:
  Antworten mit Zitat      
Hi Oli,
Zitat:
so länge löschen, bis
klingt irgendwie nach while und damit nach schleife und somit auch langsam.
Ich bin inzwischen auf die Idee gekommen, man könnte die matrix mit reshape in einen Vektor ändern, die lokalen Maxima bestimmen und anschließend anhand des Index wieder eine Matrix befüllen. Dann könnte man mit max-Maximumlöschen-max die beiden Maxima bestimmen.
Bei der Umsetzung in Code hapert es aber leider noch...

Vorschläge nehme ich gerne an Very Happy

Gruß
Schrank
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 23.04.2009, 15:51     Titel:
  Antworten mit Zitat      
Hi Schrank,

ja wie gesagt ist halt leider keine besonders elegante (Schleifenlose) Variante. Ich verstehe deinen Ansatz aber nicht so richtig, ich meine ok die lokalen maximalwerte eines Vektor is Ok, aber danach? Der 2. Peak ist ja nicht auch der 2. Maximalwert. Vielleicht könntest du das für mich nochmal etwas genauer erklären.

Meiner Meinung nach gäbe es nur einen eleganten Ansatz, wenn man den ersten Peak, ausgehend vom Maximum komplett auslöschen könnte. Dies würde aber eigentlich nur gehen, wenn du zum Beispiel weist, dass zwischen 2 Peaks immer ein Wert (z.B. 0) vorher unterschritten wird. Bzw. ich kenne gerade keinen anderen Weg.

Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
Maddy
Ehrenmitglied

Ehrenmitglied



Beiträge: 494
Anmeldedatum: 02.10.08
Wohnort: Greifswald
Version: ---
     Beitrag Verfasst am: 23.04.2009, 17:09     Titel:
  Antworten mit Zitat      
Ich skizzier mal kurz meinen Ansatzansatz aufbauend auf deiner Idee vll hilft dies ja. ( ist also nicht lauffähig Wink )

Code:

s=size(A);
B=A(:);
[I,p]=findpeaks(B) % I ist die Größe des Peaks und p sein Index

% Nun haben wir die Indizes

C=zeros(size(A));
C(p)=I; % neue Matrix nur mit den Peaks befüllen

[Y,ind]=sort(C,1,'descend');

% das gesuchte ergebnis steht dann ja quasi in den ersten beiden Zeilen
ERG=Y(2,:);
 


Irgendwie elegant sieht das aber nicht aus. Very Happy

Gruss
Gunnar
_________________

>> why
The computer did it.
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 23.04.2009, 22:37     Titel:
  Antworten mit Zitat      
Ahh ok, ja jetzt kann ichs mir auch vorstellen. Ist so besser als meine erste Idee. Würde aber noch statt sort einmal das Maximum nehmen von jedem Teilabschnitt der Peaks, und dann noch das Maximum, nachdem der Peak entfernt wurde, aber auch nur in diesem Teilabschnitt. Also mit reshape, den peakvektor in eine matrix zurückwandeln und dann max bilden, danach die max peaks aus der matrix entfernen und nochmal max bilden. Danach testen ob das wirklich schneller als sort ist. Smile

Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
Schrank
Themenstarter

Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 10.07.08
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 27.04.2009, 09:01     Titel:
  Antworten mit Zitat      
Hallo,
danke euch beiden für die Hilfe. Ich habe es, für meine Funktion zum finden von auftretenden Frequenzen in einem Signal, jetzt folgendermaßen umgesetzt:
Code:

function [freq_sort]=data2freq(data, abtastrate)
%[freq_sort]=data2freq(data, abtastrate)
%data muss die Form [Frames,Sensoren] haben.
if size(data,1)==1
    data=data';
end
frames = size(data,1); % Anzahl der frames in data
N = frames*4;               % Länge der FFT
% --- entfernt den DC Anteil aus den Daten ---
data = data-repmat(mean(data),frames,1);
% --- eigentliche fft ---
fourier = abs(fft(data,N));
% --- nimmt nur die erste hälfte der fft da rest spiegelbildlich ---
fourier_halbe=fourier(1:ceil(end/2),:);
% --- macht aus matrix einen vektor
B=fourier_halbe(:);
% --- findet die lokalen Maxima
[peak, index]=findpeaks(B);
% --- erzeugt aus vektor wieder matrix ---
C=zeros(size(fourier_halbe));
C(index)=peak;
% --- sortiert die gefundenen Frequenzmaxima ---
[peak_s ind]=sort(C,1,'descend');
% --- rechnet von der Position des lokalen maximums auf die Frequenz ---
freq_sort = abtastrate/N * (ind-1);


% --- Code mit Schleife ---
% peaks=NaN(2,size(data,2));
% for spalten=1:size(data,2)
% [pks,locs] = findpeaks(fourier(1:N/2,spalten),'sortstr','descend');
% peaks(1:2,spalten)=[locs(1)-1;locs(2)-1];
% end
% % --- gibt die beiden frequenzen mit höchster Amplitude aus ---
% freq_ampmax = abtastrate/N * peaks(1,Smile;%(locs(1)-1);
% freq_amp2ter = abtastrate/N * peaks(2,Smile;%(locs(2)-1);
 

Die Lösung ist zwar vielleicht nicht eleganter, aber sicherlich perfomanter als die Schleifenlösung. Außerdem habe ich wieder was dabei gelernt. .-)

Vielen dank!
Schrank
Private Nachricht senden Benutzer-Profile anzeigen
 
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.