声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1944|回复: 10

[编程技巧] 求极值点

[复制链接]
发表于 2007-5-4 20:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
max 和min只能求出向量的最值点,有什么办法找出极值点吗?
也就是说要求x(i)<x(i+1)并且x(i)<x(i-1)的点
我试过用循环,不过结果不理想,每次得到的极值点都不同
谢拉!先

[ 本帖最后由 mst-tum 于 2007-5-4 20:08 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-5-4 20:16 | 显示全部楼层
不妨将你的程序贴一下.
另:可以用现成的命令:fminunc, or fminsearch.
一般方法为:先画图,再在附近搜索极值点.

[ 本帖最后由 xjzuo 于 2007-5-4 20:17 编辑 ]
发表于 2007-5-4 20:19 | 显示全部楼层


可参考 emd 程序中的 extr.m,即:


  1. d = diff(x);
  2. n = length(d);
  3. d1 = d(1:n-1);
  4. d2 = d(2:n);
  5. indmin = find(d1.*d2<0 & d1<0)+1;
  6. indmax = find(d1.*d2<0 & d1>0)+1;
  7. if any(d==0)
  8.   
  9.   imax = [];
  10.   imin = [];
  11.   
  12.   bad = (d==0);
  13.   dd = diff([0 bad 0]);
  14.   debs = find(dd == 1);
  15.   fins = find(dd == -1);
  16.   if debs(1) == 1
  17.     if length(debs) > 1
  18.       debs = debs(2:end);
  19.       fins = fins(2:end);
  20.     else
  21.       debs = [];
  22.       fins = [];
  23.     end
  24.   end
  25.   if length(debs) > 0
  26.     if fins(end) == m
  27.       if length(debs) > 1
  28.         debs = debs(1:(end-1));
  29.         fins = fins(1:(end-1));
  30.       else
  31.         debs = [];
  32.         fins = [];
  33.       end      
  34.     end
  35.   end
  36.   lc = length(debs);
  37.   if lc > 0
  38.     for k = 1:lc
  39.       if d(debs(k)-1) > 0
  40.         if d(fins(k)) < 0
  41.           imax = [imax round((fins(k)+debs(k))/2)];
  42.         end
  43.       else
  44.         if d(fins(k)) > 0
  45.           imin = [imin round((fins(k)+debs(k))/2)];
  46.         end
  47.       end
  48.     end
  49.   end
  50.   
  51.   if length(imax) > 0
  52.     indmax = sort([indmax imax]);
  53.   end
  54.   if length(imin) > 0
  55.     indmin = sort([indmin imin]);
  56.   end
  57.   
  58. end  
复制代码
 楼主| 发表于 2007-5-4 20:33 | 显示全部楼层

回复 #3 eight 的帖子

:lol ,谢谢拉。大家都好勤劳,假期还在。本来没指望这么快有回复的。
我先学习下,不懂再请教。
 楼主| 发表于 2007-5-14 21:50 | 显示全部楼层
学习了以上的程序,还是有些地方不懂。
这里第27行的m指的是什么啊?
是不是写错了,应该是n吧?
发表于 2007-5-14 21:51 | 显示全部楼层
原帖由 mst-tum 于 2007-5-14 21:50 发表
学习了以上的程序,还是有些地方不懂。
这里第27行的m指的是什么啊?
是不是写错了,应该是n吧?


m = length(x);

其实仔细想想就猜到应该是原信号的程度

点评

程(长)度  发表于 2010-11-5 09:07
发表于 2010-11-5 08:18 | 显示全部楼层
本帖最后由 hyyly 于 2010-11-5 08:20 编辑

居然不会用 ,到底返回什么值呢?
发表于 2010-11-5 09:09 | 显示全部楼层
本帖最后由 Happy99 于 2010-11-5 09:10 编辑
hyyly 发表于 2010-11-5 08:18
...到底返回什么值呢?


什麼问题?
个人水平有限, 建议说清楚些
发表于 2010-11-5 10:11 | 显示全部楼层
这个不是用
  1. imregionalmax
复制代码
  1. imregionalmin
复制代码
就可以了吗?
发表于 2010-11-5 12:46 | 显示全部楼层
回复 Happy99 的帖子

我的意思是 eight  发的代码我不会使用,不过没关系,我找到更好的了。谢谢
发表于 2010-11-5 21:57 | 显示全部楼层
寻找极大值:
% from MATLAB-Wiki-FAQ
function index = localmax(x)
index = find( diff( sign( diff([0; x(:); 0]) ) ) < 0 );
LMax = x(index)
另外请参考副教授花如月的经典之作:
http://forum.vibunion.com/forum- ... A2%D0%F2%C1%D0.html

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-25 23:45 , Processed in 0.085323 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表