如何区分双峰和单峰阵列?

另外,如果数组代表一个双峰,如何找到两个峰之间的最小点?查找最小点时,不应考虑峰外的最小点(左侧峰的左侧和右侧峰的右侧)。

最佳答案

我发现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/

10-08 21:26