在向量中查找局部最大值

时间:2013-03-21 13:06:00

标签: matlab

有人可以帮助我。 我使用Matlab程序。

假设我有矢量A,

A = [0 0 1 2 3 5 0 0 0 0 0 2 3 6 7 0 0 0 0 1 1 2 3 4 1]

我想从矢量A获得局部最大值和位置。所以,我想得到的答案是:

maxValue = 5,7和4;

maxLocation = 6,15和24;

谢谢你的好意。

4 个答案:

答案 0 :(得分:7)

如果你有信号处理工具箱,那么findpeaks应该是你想要的:

[pks,locs] = findpeaks(A)

为了将来参考,你应该知道你想要找到的是局部最大值。假设您想要找到最大值,则看起来好像您想要全局最大值(在这种情况下为7)。

答案 1 :(得分:2)

您需要更清楚自己的目标。看起来您希望在矢量中找到局部最大值。

你是否总是有向量(不是真正的数组,通常是一个词来表示具有两个非单位维的东西),它们具有你想要找到的局部最大值?你会选择找到所有当地最大值吗?如果是这样,那么这将有效...

A = [0 0 1 2 3 5 0 0 0 0 0 4 5 6 7 0 0 0 0 1 1 2 3 4 1];

n = numel(A);
ind = 2:(n-1);

maxLoc = ind(find((diff(ind-1) > 0) & (diff(ind) < 0)));

% in case the max occurs at an end
if A(2) < A(1)
  maxLoc = [1,maxLoc];
end
if A(n) < A(n-1)
  maxLoc = [maxLoc,n];
end

maxVal = A(maxLoc);

但是矢量呢

A = [0 1 2 2 1 0];

你现在想看到什么?

同样,您需要考虑您的要求。你有什么需求。目标是什么?

一旦你这样做了,那么你的问题将更容易解决,并且更容易让人回答。

答案 2 :(得分:2)

我假设您正在寻找局部最大值 - 即,值大于它们周围的值。

我的解决方案是:

Loc = find(diff(A)(2:end)<0 & diff(A)(1:(end-1))>0)+1;
Val = A(Loc);

Loc将包含局部最大值的位置,Val将包含这些局部最大值的值。请注意,它不会像写的那样在边缘找到最大值。如果你想要检测它们,你必须稍微修改它:

Loc = find([A(1)>A(2),(diff(A)(2:end)<0 & diff(A)(1:(end-1))>0),A(end)>A(end-1)]);
Val = A(Loc);

答案 3 :(得分:-2)

你想找到4,5和7的每一次出现吗? 尝试:

Output = find(A>3)

这将返回1xN向量,其中任意位置超过3 ... 不确定这是否是你想要的