cc2005726 发表于 2009-9-8 20:24

找函数极大值点的再讨论

在发这个帖之前先搜了下,有找极值点的代码如下:
y是一个数据
yf=y(2:end-1)-y(1:end-2);   %前向差分
yb=y(2:end-1)-y(3:end);   %后向差分
I=find(yf.*yb>=0);             %寻找极值点(不考虑首尾两点)
I=I+1;
则I是极值点的下标了。
还有
%data是你的数据
find(diff(sign(diff(data)))==-2)+1;
% 找到极大值的位置
find(diff(sign(diff(data)))==2)+1;
% 找到极小值的位置

但这么做不能解决在极值点连续重复几次出现的情况,比如:
y=[ 3 1 4 4 6 6 2];
若用第一种方法找极大值点,
yf=y(2:end-1)-y(1:end-2);   %前向差分
yb=y(2:end-1)-y(3:end);   %后向差分
I=I=find(yf>=0&yf.*yb>=0&yb>=0);%寻找极值点(不考虑首尾两点)
I=I+1;
则找到的极值点的下标是3 5 6,错y(3)当成极大值点了

若用第二种方法,则I为空阵。
请问在这种情况下如何找到极大值点呢?要求或极值点连续出现,则以最开始出现的那一个极值点为准。
还是以y=[ 3 1 4 4 6 6 2];为例,要求最后求出的极大值点下标就是5

ChaChing 发表于 2009-9-9 16:49

的确如LZ所说, 之前看到的一些方法, 针对一些重覆点好像都并无考虑!
参考16F我问过的疑问
http://forum.vibunion.com/forum/viewthread.php?tid=32967&extra=&highlight=%2Bhappy&page=2

[ 本帖最后由 ChaChing 于 2009-9-9 16:51 编辑 ]

cc2005726 发表于 2009-9-10 17:19

回复 沙发 ChaChing 的帖子

其实用我上面提到的第一种方法可以找到,但是又出现了另一个问题。
代码如下:
y=[ 3 1 4 4 6 6 2]; yf=y(2:end-1)-y(1:end-2);yb=y(2:end-1)-y(3:end);
I=find(yf>=0&yf.*yb>=0&yb>=0); I=I+1;
plot(y,'b'); hold on; plot(I,y(I),'r*')
程序结果图如下:
在不是极大值点的4处也标了红色标志
不知道如何才能两全其美

[ 本帖最后由 ChaChing 于 2009-9-10 20:19 编辑 ]

ChaChing 发表于 2009-9-10 20:56

没太多时间验证其他状况, 请LZ试试吧!
clc; clear; y=[ 3 1 4 4 6 6 2];
yf=diff(y); ii=find(yf==0)+1;
yy=y; yy(ii)=yy(ii)+yf(ii).*eps;
imax=find(diff(sign(diff(yy)))==-2)+1

cc2005726 发表于 2009-9-11 16:39

回复 地板 ChaChing 的帖子

明白您的思想了,我怎么没想到啊。。。谢谢啦

不过例如 当y=[ 3 1 4 4 4 6 6 6 2]时,又不行了

[ 本帖最后由 ChaChing 于 2009-12-14 01:29 编辑 ]

ChaChing 发表于 2009-9-13 20:25

没错多点重覆要出问题, 太晚累了, 明天有空再想想!

目前没想到什么好方式, 先用了循环处理了, 请LZ试试看! 不知是否有考虑完善
y=[ 3 1 4 4 4 6 6 6 2]; find_max(y)
y=[ 3 1 4 4 4 6 6 6 6 7 7 8]; find_max(y)
y=[ 3 3 3 3]; find_max(y)
y=[ 3 2 3 3 2 1 2 2 3 3 2 1 ]; find_max(y)
y=[ 3 4 3 3 2 1 2 2 3 3 2 1 ];find_max(y)
function imax=find_max(y)
%y=[ 3 1 4 4 4 6 6 6 2];
ny=length(y); imax=[]; jmax=1; ii=2;
while ii<=ny
   if isempty(jmax), if y(ii)>y(ii-1), jmax=ii; end
   else
      if y(ii)<y(jmax), imax=; jmax=[]; elseif y(ii)>y(jmax), jmax=ii; end
   end
   ii=ii+1;
end
if ~isempty(jmax), imax=; end
plot(y,'b'); hold on; plot(imax,y(imax),'r*'); hold off


[ 本帖最后由 ChaChing 于 2009-12-14 01:30 编辑 ]

cc2005726 发表于 2009-9-14 10:51

回复 8楼 ChaChing 的帖子

我试了一些个数据,都运行地挺好的。ChaChing把细节都考虑到了,:@)

xylee 发表于 2012-10-11 16:11

循环处理也已经很好了。{:{26}:}
页: [1]
查看完整版本: 找函数极大值点的再讨论