如何区分双峰和单峰阵列?
另外,如果数组代表一个双峰,如何找到两个峰之间的最小点?查找最小点时,不应考虑峰外的最小点(左侧峰的左侧和右侧峰的右侧)。
最佳答案
我发现PEAKDET函数虽然是基于循环的,但却相当可靠且快速。它不需要对噪声数据进行预平滑处理,但是可以找到差异大于参数delta
的局部最大和最小极值。
由于PEAKDET从左到右运行,因此有时会错过右侧站点的峰值。为了避免它,我希望运行两次:
%# some data
n = 100;
x = linspace(0,3*pi,n);
y = sin(x) + rand(1,n)/5;
%# run peakdet twice left-to-right and right-to-left
delta = 0.5;
[ymaxtab, ymintab] = peakdet(y, delta, x);
[ymaxtab2, ymintab2] = peakdet(y(end:-1:1), delta, x(end:-1:1));
ymaxtab = unique([ymaxtab; ymaxtab2],'rows');
ymintab = unique([ymintab; ymintab2],'rows');
%# plot the curve and show extreme points based on number of peaks
plot(x,y)
hold on
if size(ymaxtab,1) == 2 && size(ymintab,1) == 1 %# if double peak
plot(ymintab(:,1),ymintab(:,2),'r.','markersize',30)
elseif size(ymaxtab,1) == 1 && size(ymintab,1) == 0 %# if single peak
plot(ymaxtab(:,1),ymaxtab(:,2),'r.','markersize',30)
else %# if more (or less)
plot(ymintab(:,1),ymintab(:,2),'r.','markersize',30)
plot(ymaxtab(:,1),ymaxtab(:,2),'r.','markersize',30)
end
hold off
关于matlab - 如何在MATLAB中区分双峰和单峰阵列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10303968/