3QMM 发表于 2008-5-7 15:49

如何求时间序列的所有波峰和波谷

对一序列,如何在matlab中求得多个波峰波谷?并希望能够显示波峰波谷所在的索引号。而且这些波峰波谷的值在不断的变化。如图
我知道有一种比较死板的方法,就是循环使用max和min,不知道大家有没有什么更好的方法?

[ 本帖最后由 eight 于 2008-5-7 16:05 编辑 ]

sogooda 发表于 2008-5-7 16:04

试试diff,置顶帖里有类似的技巧可供参考。

eight 发表于 2008-5-7 16:05

原帖由 3QMM 于 2008-5-7 15:49 发表 http://www.chinavib.com/forum/images/common/back.gif
对一序列,如何在matlab中求得多个波峰波谷?并希望能够显示波峰波谷所在的索引号。而且这些波峰波谷的值在不断的变化。如图
我知道有一种比较死板的方法,就是循环使用max和min,不知道大家有没有什么更好的方法? 这个问题讨论过无数次,请版面搜索局部极小值,或者 extr

3QMM 发表于 2008-5-7 16:07

谢谢提醒,前两天刚刚用diff求了极小值和极大值。:loveliness: :loveliness:

lcgs005 发表于 2011-3-4 10:28

回复 4 # 3QMM 的帖子

能否指导一下,急用这个方法来处理工作中的事,再不解决,明天下岗了

zhouyang664 发表于 2011-3-4 12:24

回复 5 # lcgs005 的帖子

论坛或者网络上好多,求极值的程序,多搜一下!

zhouyang664 发表于 2011-3-4 12:25

回复 5 # lcgs005 的帖子

仅供参考:

离散序列求极值问题小结


--------------------------------------ilxy的方法-------------------------------------------------------------------
aa=randperm(20)
bb=intersect(find(diff(aa)>0)+1,find(diff(aa)<0))
----------------------------------hyperelastic 的方法----------------------------------------------------------
N = 100; aa=randperm(N);
index = find(((aa(2:N-1)>aa(1:N-2))+(aa(2:N-1)>aa(3:N)))==2)+1;
bb = aa(index);
-------------------bainhome 的方法-----------------------------------------------------------------------------
a=rand(1,100);find(diff(sign(diff(a)))>0)+1
------------------------------------------------------------------------------------------------------------------------
以上代码都是求极大值,略微变换后可以得到极小值。出自:中华钢结构论坛
------------------------------------eight版主给的方法------------------------------------------------------------
d=diff(x); n=length(d);
d1=d(1:n-1); d2=d(2:n);
indmin=find(d1.*d2<0 & d1<0)+1;
indmax=find(d1.*d2<0 & d1>0)+1;
------------------------------------------------------------------------------------------------------------------------

寻找极大值:

function index = localmax(x)
index = find( diff( sign( diff() ) ) < 0 );
------------------------------------------------------------------------------------------------------------------------
      极值:
      data是你的数据,
      find(diff(sign(diff(data)))==-2)+1
      找到极大值的位置

      find(diff(sign(diff(data)))==2)+1
      找到极小值的位置

      data(find(diff(sign(diff(data)))==-2)+1)和
      data(find(diff(sign(diff(data)))==2)+1)
      返回的是极大值和极小值
------------------------------------------------------------------------------------------------------------------------
>> c=rand(1,10)

c =

      0.9575      0.9649      0.1576      0.9706      0.9572      0.4854      0.8003      
0.1419      0.4218      0.9157

>> p1=c(imregionalmax(c))   % 区间极大值

p1 =

      0.9649      0.9706      0.8003      0.9157

>> p2=c(imregionalmin(c))   % 区间极小值

p2 =

      0.9575      0.1576      0.4854      0.1419

lcgs005 发表于 2011-3-4 13:31

回复 7 # zhouyang664 的帖子

谢谢,不过,这个要先学习哪个基础的软件?

zhouyang664 发表于 2011-3-4 21:31

MATLAB啊!

lcgs005 发表于 2011-3-5 11:03

谢谢,我加班学软件先

ChaChing 发表于 2011-3-5 11:09

回复 10 # lcgs005 的帖子

好奇问下LS会那些软件!?

lcgs005 发表于 2011-3-5 12:59

回复 11 # ChaChing 的帖子

新手,连门还没入,主要想学学曲线拟合与线性回归方面的东西,有时间了,多指教下哦,在下先感谢了

ChaChing 发表于 2011-3-5 20:47

回复 12 # lcgs005 的帖子

ok, 互相加油!
页: [1]
查看完整版本: 如何求时间序列的所有波峰和波谷