在matlab中找到峰值

时间:2013-03-19 10:12:50

标签: matlab

假设我们确定向量中的峰值如下: 我们有一个长度为m的实数值的一维向量,或 X(1),X(2),... X(米) 如果x(1)> x(2)那么第一点峰值(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

峰值也使用以下图片确定: enter image description here

对不起第二张图片,也许它不是三角形,只是A和C在直线上,但这里的峰值是B,所以我无法继续编写算法的代码来查找我的vector中的峰值。帮我继续吧

updated.numercial example given

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

3 个答案:

答案 0 :(得分: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

然而,这也会给你“平稳”(邻近和相等的“峰值”)。

答案 1 :(得分: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

为你的例子。

答案 2 :(得分:0)

如果你有一个最新的matlab版本,它会发现它,但它也有点慢。

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

您可以堆叠数据以便有三列:第一列是前一个值,第二个是数据,第三个是下一个值,做一个最大值,你的局部最大值是哪个点列的最大位置是2。

我把它编码为我自己的峰值检测功能的子程序,增加了更高水平的迭代峰值检测 http://www.mathworks.com/matlabcentral/fileexchange/42927-find-peaks-using-scale-space-approach