******************对一维数组求局部极大值或局部极小值*******************
方法一:
获得一维离散数据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的最大值。