MATLAB求离散数据的极值点

本文介绍了使用MATLAB求解极值的方法。对于一维离散数据,可通过特定公式获取局部极大值、极小值及其位置,也可用fingpeaks函数求解局部极大值。对于二维矩阵,可使用imregionalmax和imregionalmin函数求局部极值,还给出了求解矩阵最大值的方法。

******************对一维数组求局部极大值或局部极小值*******************
方法一:

获得一维离散数据y的局部极大值:extrMaxValue = y(find(diff(sign(diff(y)))==-2)+1);
获得一维离散数据y的局部极大值的位置:extrMaxIndex = find(diff(sign(diff(y)))==-2)+1;
获得一维离散数据y的局部极小值:extrMaxValue = y(find(diff(sign(diff(y)))==+2)+1);
获得一维离散数据y的局部极小值的位置:extrMaxIndex = find(diff(sign(diff(y)))==+2)+1;
举例说明:

y= [1 2 3 4 5 6 7 8 1];

 diff(y)= 1 1 1 1 1 1 1 -7 %说明:用后面一个数减去前面一个数。
sign(diff(y))=1 1 1 1 1 1 1 -1 %说明:返回正负数的判断逻辑值值,正的为1,负的为-1 。
diff(sign(diff(y)))=0 0 0 0 0 0 -2
find(diff(sign(diff(y)))==-2)+1 %说明:find(diff==-2)的位置+1才对应局部极大值的位置
y(find(diff(sign(diff(y)))==-2)+1): 返回局部极大值。

同理:y= [1 2 3 4 5 6 7 8 1 2 3 1 5 9 4]------15个数 1 1 1 1 1 1 1 -7 1 1 -2 4 4 -5 ------14个数 1 1 1 1 1 1 1 -1 1 1 -1 1 1 -1 ------14个数 0 0 0 0 0 0 -2 2 0 -22 0 -2 ------13个数 extrMaxValue = 8 3 9extrMaxIndex = 8 11 14 总体就是类似于找拐点(数学)--头尾均不考虑在内。

 

方法二:
matlab2009以上有一个函数fingpeaks,可以对一维数组直接求解局部极大值:
举例说明:
y= [1 2 3 4 5 6 7  8 1 2  3 1 5  9 4];
x=findpeaks(y); %则x =8 3 9

 

******************对二维矩阵求局部极大值或局部极小值*******************
matlab自带函数imregionalmax和imregionalmin。
格式:imregionalmax(A,n)
说明:A可以使2D数据或3D数据,n为求局部极值所采用的方法,默认2D时n=8(八邻域法);3D时n=26.2D时,n=4/8;3D时,n=6/18/26 。
返回值:一个二值逻辑矩阵,结构与A相同(1:表示局部极大值;0表示:非局部极大值)。
举例说明:某10*10矩阵
A =

     1     1     1     1     1     1     1     1     1     1
     1     4     4     4     1     1     1     1     1     1
     1     4     4     4     1     1     1     1     1     1
     1     4     4     4     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     9     9     1     1
     1     1     1     1     1     9    10     9     1     1
     1     1    44     1     1     9     9     9     1     1
     1     1     1    45     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1

 四邻域求局部极大值:A1=imregionalmax(A,4);得到A1

A1 =

     0     0     0     0     0     0     0     0     0     0
     0     1     1     1     0     0     0     0     0     0
     0     1     1     1     0     0     0     0     0     0
     0     1     1     1     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     1     0     0     0
     0     0     1     0     0     0     0     0     0     0
     0     0     0     1     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0

八邻域秋局部极大值:A1=imregionalmax(A);得到的结果与上面的结果略有差别。

A1 =

     0     0     0     0     0     0     0     0     0     0
     0     1     1     1     0     0     0     0     0     0
     0     1     1     1     0     0     0     0     0     0
     0     1     1     1     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     1     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     1     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0

利用matalab的点乘命令:A2=A1.*A,得到与原始矩阵A相对应的局部极大值矩阵。

A2 =

     0     0     0     0     0     0     0     0     0     0
     0     4     4     4     0     0     0     0     0     0
     0     4     4     4     0     0     0     0     0     0
     0     4     4     4     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0    10     0     0     0
     0     0    44     0     0     0     0     0     0     0
     0     0     0    45     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0

*****************矩阵最大值的求解************************

B=zeros(size(A));
idx=find(A==max(max(A)));
for k=1:size(idx,1);
   [i,j]=ind2sub(size(A),idx(k));
   B(i,j)= A(i,j);
end
举例说明
A =

     45    1     1     1     1     1     1     1     1     1
     1     4     4     4     1     1     1     1     1     1
     1     4     4     4     1     1     1     1     1     1
     1     4     4     4     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     9     9     1     1
     1     1     1     1     1     9    10     9     1     1
     1     1    44     1     1     9     9     45    1     1
     1     1     1    45     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1

得到原矩阵A对应的最大值矩阵:
B =

     45    0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     45    0     0
     0     0     0    45     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0

如果不需要算最大值的位置,直接用max(max(A))或者max(A(:)),都可以求出矩阵A的最大值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值