假设我们确定向量中的峰值如下: 我们有一个长度为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
峰值也使用以下图片确定:
对不起第二张图片,也许它不是三角形,只是A和C在直线上,但这里的峰值是B,所以我无法继续编写算法的代码来查找我的vector中的峰值。帮我继续吧
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 如果第一个元素小于第二个元素,那么我们将第二个元素与第三个元素进行比较,如果第二个元素与第三个元素相同,第一个元素同时存在,则峰值为第二个,依此类推
答案 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)
由于for循环,这个提议的解决方案会非常慢,并且由于您将最大值与中心值进行比较而不是比较最大值的位置,因此您还存在舍入误差的风险,这是更适合您的目的。
您可以堆叠数据以便有三列:第一列是前一个值,第二个是数据,第三个是下一个值,做一个最大值,你的局部最大值是哪个点列的最大位置是2。
我把它编码为我自己的峰值检测功能的子程序,增加了更高水平的迭代峰值检测 http://www.mathworks.com/matlabcentral/fileexchange/42927-find-peaks-using-scale-space-approach