MATLAB求离散数据的极值点 | 您所在的位置:网站首页 › 函数有几个极值点怎么求 › MATLAB求离散数据的极值点 |
******************对一维数组求局部极大值或局部极小值*******************
方法一:
获得一维离散数据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 -2find(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的最大值。 |
CopyRight 2018-2019 实验室设备网 版权所有 |