2014-09-23 33 views
0

我正在使用以下代碼來計算跨各種資產的時間序列數據中的峯值。峯值被定義爲大於其相鄰點的任何時間點序列。根據峯值數量計算代碼中的分數,如下所示。 input_args是這種格式,rc是input_args的大小。這段代碼工作正常,但是當我長時間在資產上調用它時需要很長時間。他們是讓代碼更高效的一種方法。我正在尋找一種解決方案,通過該解決方案,我可以創建一個邏輯陣列,以確定滿足峯值條件的時間序列中的點,然後將它們隔離以計算得分?使用Matlab查找時間序列中的局部峯值和谷值

Data:- 
1 
0.997 
0.979 
0.952 
0.935 
0.942 
0.987 
1.027 
1.036 
1.049 

function [maxhill] = hill_calc(input_args,rc) 
for i=2:rc(1)-1  
    if and(input_args(i)>input_args(i+1),input_args(i)>input_args(i-1)) 
    output_args_hills(i-1) = 2*input_args(i)-input_args(i+1)-input_args(i-1); 
    else output_args_hills(i-1) = NaN; 
    end 
end 
maxhill = max(output_args_hills); 
end 

回答

1

你可以很容易地計算峯值的指標如下:

ind = 1+find((input_args(2:end-1)>input_args(1:end-2)) & ... 
    (input_args(2:end-1)>input_args(3:end))); 

Example_

>> input_args = [1 2 5 4 7]; 

ind = 
    3 

這意味着只有第三值是峯。

1

假設你沒有訪問到信號處理工具箱內置功能findpeaks ...

您可以使用diff功能,像這樣找峯:

peaks = [false; diff(diff(y) > 0) < 0; false] 

例如:

x = 1:100; 
y = sin(0.2*x)+sin(rand()*x)*0.2; 
peaks = [false, diff(diff(y) > 0) < 0, false]; 
plot(x,y); 
hold on; 
plot(x(peaks),y(peaks), 'ro') 

enter image description here

請注意,槽只需要翻轉小於號

troughs = [false; diff(diff(y) > 0) > 0; false] 
相關問題