1

有人可以帮助我。我使用 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 中获取局部最大值和位置。所以,我想得到的答案如下。

最大值 = 5、7 和 4;

最大位置 = 6、15 和 24;

谢谢你的好意。

4

4 回答 4

7

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

[pks,locs] = findpeaks(A)

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

于 2013-03-21T13:21:56.467 回答
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];

你现在想看什么?

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

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

于 2013-03-21T13:22:54.987 回答
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);
于 2013-03-21T13:48:38.873 回答
-2

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

Output = find(A>3)

这将返回一个 1xN 向量,其位置超过 3...虽然不确定这是否是您想要的

于 2013-03-21T13:22:01.097 回答