1

假设我们确定向量中的峰值如下:如果 x(1)>x( 2) 然后很明显对于第一个点 peak(1)=x(1);否则我们将 x(3) 与 x(2) 进行比较,如果 x(3)

[ indexes,peaks]=function(x,m);
c=[];
b=[];
if  x(1)>x(2) 
    peaks(1)=x(1);
else

 for i=2:m-1
     if x(i+1)< x(i) & x(i)>x(i-1)
         peak(i)=x(i);
     end;
 end
end
end

峰值也使用下图确定: 在此处输入图像描述

抱歉第二张图片,也许它不是三角形,只是 A 和 C 在直线上,但这里的峰值是 B,所以我无法继续编写算法以在我的向量中找到峰值。请帮助我继续

updated.numercial 给出的例子

x=[2 1 3 5 4 7 6 8 9] 这里因为第一个点比第二个多,所以这意味着峰值(1)=2,然后我们比较 1 和 3,因为 3 大于 1,我们现在想比较5比3,也是比较多,比较5比4,因为5比4多,那么就意味着peak(2)=5,所以如果我们继续下一个峰值是7,那么最终的峰值就是9 如果第一个元素小于第二个,那么我们将第二个元素与第三个元素进行比较,如果第二个元素同时大于第三个和第一个元素,则峰值是第二个,依此类推

4

3 回答 3

2

你可以尝试这样的事情:

function [peaks,peak_indices] = find_peaks(row_vector)
    A = [min(row_vector)-1 row_vector min(row_vector)-1];
    j = 1;
    for i=1:length(A)-2
        temp=A(i:i+2);
        if(max(temp)==temp(2))
            peaks(j) = row_vector(i);
            peak_indices(j) = i;
            j = j+1;
        end
    end
end

将其保存为 find_peaks.m

现在,您可以将其用作:

>> A = [2 1 3 5 4 7 6 8 9];
>> [peaks, peak_indices] = find_peaks(A)

peaks =

     2     5     7     9


peak_indices =

     1     4     6     9

然而,这也会给你“高原”(相邻且相等的“峰值”)。

于 2013-03-19T10:32:04.030 回答
1

您可以使用diff进行比较并在开头和结尾添加两个点以覆盖边界情况:

B=[1 diff(A) -1]; 
peak_indices = find(B(1:end-1)>=0 & B(2:end)<=0); 
peaks = A(peak_indices);

它返回

peak_indices =
     1     4     6     9
peaks =
     2     5     7     9

以你为例。

于 2013-08-03T12:21:33.810 回答
0

如果您有最新的 matlab 版本,findpeaks 会这样做,但它也有点慢。

由于 for 循环,这个建议的解决方案会非常慢,并且由于您将最大值与中心值进行比较而不是比较最大值的位置,您还存在舍入误差的风险,这对您来说更好目的。

您可以将数据堆叠成三列:第一列是前面的值,第二列是数据,第三列是下一个值,做一个最大值,你的局部最大值是位置的点沿列的最大值为 2。

我已将此编码为我自己的峰值检测功能的子程序,它增加了更高级别的迭代峰值检测 http://www.mathworks.com/matlabcentral/fileexchange/42927-find-peaks-using-scale-space-方法

于 2013-08-03T11:46:54.943 回答