爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17783|回复: 13

[混合编程] 利用matlab求极值的方法总结

[复制链接]
发表于 2013-7-26 13:51:05 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
情况1:寻找序列极值的数值如果只需要寻找极值点的数值,而不需要确定极值点所在的位置。可以使用matlab自带的findpeaks函数
例如:>> aa=randperm(20)

aa =


  Columns 1 through 11


     6     3    16    11     7    17    14     8     5    19    15


  Columns 12 through 20


     1     2     4    18    13     9    20    10    12


>>  cc = findpeaks(aa)

cc =

    16    17    19    18    20




情况二:寻找极值点的坐标


如果不仅需要寻找极值点的数值,并且需要确定极值点所在的位置。可以使用如下代码。
思想:如果一阶导数为零,二阶导数小于零,则为极大点

>> bb=intersect(find(diff(aa)>0)+1,find(diff(aa)<0))
bb =
    3     6    10    15    18

bb:即为极值点所在的坐标的数组。使用如下代码可以得到跟findpeaks求出来的一样的极值
L_extre = length(bb);
         for b1 = 1 : L_extre
            dd(1,b1) = aa(1,bb(b1));
         end


当然还有其他的方法得到极值点的坐标:可以查阅这篇博文。
http://hi.baidu.com/honinbou/item/4cd11473362cb428d7a89cb6

情况三:求一组长序列的20个较大的极大值。


        假设一组序列有N个极大值(N > 20),要求得到20个较大的极大值。


以下是我自己尝试写的代码,如有纰漏请指教。aa为一个长度为num的序列。要求:保留20个极值点的值,其余值都置0。
  bb = intersect(find(diff(aa)>0)+1,find(diff(aa)<0));
         L_extre = length(bb);
         for b1 = 1 : L_extre
            aa_extre(1,b1) = aa(1,bb(b1));
         end
         
            [value1 ,index1 ] = sort(aa_extre,'descend');  %降序排列
            index2 = index1(1 : 20); %得到前20个较大极大值的坐标
            for i3 = 1 : num
                for i4 = 1 : 20
                    if i3 == bb(index2(i4))
                        aa(1,i3) = aa(1,i3);
                        break;
                    else
                        aa(1,i3) = 0;
                    end
                end
            end   



密码修改失败请联系微信:mofangbao
0
早起挑战累计收入
发表于 2013-7-26 16:32:55 | 显示全部楼层
图挂掉啦
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2013-7-26 17:33:13 | 显示全部楼层

我这里图是现实的呢?
密码修改失败请联系微信:mofangbao
发表于 2014-5-14 04:40:44 | 显示全部楼层
简单实用!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

发表于 2014-5-14 10:21:11 | 显示全部楼层
2.寻找极值点的坐标
a=magic(3);
[anew ind]=sort(a(:),'descend'); %倒序求极大
[loc_i loc_j]=ind2sub(size(a),ind(1));
3.求一组长序列的20个较大的极大值。
a=magic(5);
[anew ind]=sort(a(:),'descend'); %倒序求极大
[loc_i loc_j]=ind2sub(size(a),ind(1:20));
-------------------------------------------------------------------------------------
enjoy!


密码修改失败请联系微信:mofangbao
发表于 2014-5-14 10:21:29 | 显示全部楼层
2.寻找极值点的坐标
a=magic(3);
[anew ind]=sort(a(:),'descend'); %倒序求极大
[loc_i loc_j]=ind2sub(size(a),ind(1));
3.求一组长序列的20个较大的极大值。
a=magic(5);
[anew ind]=sort(a(:),'descend'); %倒序求极大
[loc_i loc_j]=ind2sub(size(a),ind(1:20));
-------------------------------------------------------------------------------------
enjoy!


密码修改失败请联系微信:mofangbao
发表于 2014-5-14 10:43:47 | 显示全部楼层
唉 不明觉厉 学习吧
密码修改失败请联系微信:mofangbao
发表于 2015-6-13 21:27:24 | 显示全部楼层
真不错
赞一个 很有用
密码修改失败请联系微信:mofangbao
发表于 2015-6-26 16:34:05 | 显示全部楼层
简单实用!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

发表于 2016-3-4 17:13:59 | 显示全部楼层
[pks,locs] = findpeaks(data)  求极值 附带位置
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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