2016-10-13 7 views
1

Ich muss den Unterschied zwischen positiven und negativen Spitzen finden, wo die Differenz größer als + -3 ist.Finden Sie den Unterschied zwischen positiven und negativen Spitzen MATLAB

Ich verwende findpeaks Funktion in MATLAB, um die positiven und negativen Spitzen der Daten zu finden. In einem Beispiel von meinem Code:

[Ypos, Yposloc] = findpeaks(YT0); 
[Yneg, Ynegloc] = findpeaks(YT0*-1); 
Yneg = Yneg*-1; 

Yposloc und Ynegloc geben die Positionen der positiven und negativen Spitzen in den Daten.

Ich möchte Ypos und Yneg basierend auf der Reihenfolge der Peaks verketten.

Zum Beispiel meine Gipfel sind

Ypos = [11 6 -10 -10 6 6 6 6 6 -5] 
Yneg = [-12 -14 -11 -11 -11 5 5 5 -6] 

Standorte in YT0

Yposloc = [24 63 79 84 93 95 97 100 156] 
Ynegloc = [11 51 78 81 85 94 96 99 154] 

In diesem Fall, in dem beide Yposloc und Ynegloc 9x1 sind, kann ich die folgenden;

nColumns = size(Yposs,2); 
YTT0 = [Yneg, Ypos]'; 
YTT0 = reshape(YTT0(:),nColumns,[])'; 
YTT0 = diff(YTT0) 
YT0Change = numel(YTT0(YTT0(:)>=3 | YTT0(:)<=-3)); 

Total der Veränderungen, die ich interessiert bin, ist 6

Ich brauche aber automatisch Yneg und Ypos verketten, basierend auf ihren Standorten. Also denke ich, dass ich eine if Aussage machen muss, um herauszufinden, ob meine positiven oder negativen Spitzen zuerst kommen? Dann bin ich mir nicht sicher, wie man das Problem angeht, wenn Ypos und Yneg verschiedene Größen sind.

Ich führe dieses Skript mehrmals aus, wo Daten sich ändern und die negative/positive Spitzenordnung sich ständig ändern. Gibt es eine einfache Möglichkeit, die Peak-Standorte zu vergleichen oder bin ich hier auf dem richtigen Weg?

+0

ich bin nicht ganz sicher, was Ihr Ziel ist. Sie haben Minima und Maxima und den entsprechenden Ort. Dann berechnen Sie den Gewinn oder Verlust von denen und wollen zählen, wo der Unterschied zwischen min und max (oder max und min) größer ist 3. Bin ich soweit? Ist das alles, was du willst? Wie möchten Sie den Standort vergleichen? ob sie sich am selben Punkt befinden oder den gleichen Abstand zueinander oder etwas anderes haben? – Finn

+0

Hallo Fin, ich habe meinen Beitrag etwas bearbeitet. Ja, du hast Recht bis jetzt. Grundsätzlich betrachte ich Bewegungen in einer Gesichtspräsentation zur Kamera. Ich bin an "spürbaren" Bewegungen interessiert, d. H. Wenn es eine große Veränderung von Spitze zu Spitze gibt. Bis jetzt möchte ich den Standort basierend auf dem vergleichen, was zuerst kommt, d. H. Wenn der positive Ort zuerst kommt, vergleiche mit dem Negativen, dann mit dem Positiven und so mit dem Vierten. –

Antwort

1

Ich würde jedes Minimum mit sowohl die vorherigen als auch die nächsten Maxima überprüfen. Um das zu tun, dass Sie zunächst positiven und negativen Spitzen entsprechend ihrer Reihenfolge kombinieren:

Y = zeros(1, max([Yposloc, Ynegloc])); 
Yloc = zeros(size(Y)); 
Yloc(Yposloc) = Yposloc; 
Yloc(Ynegloc) = Ynegloc; 
Y(Yposloc) = Ypos; % I think you inserted one extra '6' in your code! 
Y(Ynegloc) = Yneg; 
Y = Y(Yloc ~= 0) % this is the combined signal 
Yloc = Yloc(Yloc ~= 0) % this is the combined locations 

% Y = 
% 
% -12 11 -14 6 -11 -10 -11 -10 -11 6 5 6 5 6 5 6 -6 -5 
% 
% Yloc = 
% 
% 11 24 51 63 78 79 81 84 85 93 94 95 96 97 99 100 154 156 

Und dann berechnen Sie die Unterschiede:

diff(Y) 

% ans = 
% 
% 23 -25 20 -17 1 -1 1 -1 17 -1 1 -1 1 -1 1 -12 1 

Wenn Sie Änderungen von mindestens 6 Einheiten:

num = sum(abs(diff(Y)) > 6) 

% num = 
% 
%  6 
+0

Hi erfan, vielen Dank dafür. Wenn Sie dies jetzt durchgehen - Y = Nullen (1, max ([yposloc, ynegloc])) gibt den Fehler unter Verwendung von Nullen zurück, Größeneingaben müssen skalar sein. Nicht sicher, wie man das bekämpft? (Entschuldigung - Bit eines Neulings mit Matlab!) –

+0

Hallo Josh. Ich denke, Ihr Ypsiloc und Ynegloc sind in einer anderen Orientierung als Ihre Beispiele. Was bringt 'size (Yposloc)' zurück? Wahrscheinlich wird 'max ([Yposloc; Ynegloc])' (mit Semikolon) das Problem lösen. – erfan

+0

Es gibt ans = 9 1 .. Ich glaube, ich habe Sie verwirrt, indem Sie es wie 1x9 geschrieben haben, tut mir leid! –

1
Ypos = [11 6 -10 -10 6 6 6 6 -5]; 
Yneg = [-12 -14 -11 -11 -11 5 5 5 -6]; 
Yposloc = [24 63 79 84 93 95 97 100 156]; 
Ynegloc = [11 51 78 81 85 94 96 99 154]; 

TOTAL=[Yposloc Ynegloc;Ypos Yneg]; 
%creatin a vector with positions in row 1 and values in row 2 
[~,position]=sort(TOTAL(1,:)); 

%resort this matrix so the values are in the orginial order 
TOTAL_sorted=TOTAL(:,position); 
%look at the changes of the values 
changes=diff(TOTAL_sorted(2,:)); 

if changes(1)>0 
    disp('First value was a Minimum') 
else 
    disp('First value was a MAximum') 
end 
%same structure at the TOTAL matrix 
%abs(changes)>3 produces a logical vector that shows where the absolute values was bigger 
%than 3, in my opinon its rather intresting where the end is then were the start is 
% thats why i add +1 
Important_changes=TOTAL_sorted(:,find(abs(changes)>3)+1); 

plot(TOTAL_sorted(1,:),TOTAL_sorted(2,:)) 
hold on 
plot(Important_changes(1,:),Important_changes(2,:),... 
    'Marker','o','MarkerSize',10, 'LineStyle','none'); 
hold off 
Verwandte Themen