我使用以下代码计算各种资产的时间序列数据中的峰值。峰值定义为任何大于其相邻点的时间序列。根据峰值数量,我在代码中计算得分,如下所示。 input_args采用这种格式,rc是input_args的大小。这段代码工作正常,但是当我跨资产长时间调用它时需要花费很多时间。他们是一种使这段代码更有效的方法。我正在寻找一个解决方案,通过该解决方案,我可以创建一个逻辑数组,以确定满足峰值条件的时间序列中的点,然后将它们隔离以计算得分?
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
答案 0 :(得分:1)
您可以按如下方式轻松计算峰的指数:
ind = 1+find((input_args(2:end-1)>input_args(1:end-2)) & ...
(input_args(2:end-1)>input_args(3:end)));
实施例_
>> input_args = [1 2 5 4 7];
给出
ind =
3
意味着只有第三个值才是峰值。
答案 1 :(得分:1)
假设您无法访问信号处理工具箱中的内置函数findpeaks
...
您可以使用diff
函数找到峰值,如下所示:
peaks = [false; diff(diff(y) > 0) < 0; false]
e.g:
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')
请注意,低谷只需要翻转小于号
troughs = [false; diff(diff(y) > 0) > 0; false]