有人可以帮助我。我使用 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;
谢谢你的好意。
有人可以帮助我。我使用 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;
谢谢你的好意。
如果您有信号处理工具箱,那么findpeaks
应该是您想要的:
[pks,locs] = findpeaks(A)
为了将来参考,您应该知道您想要找到的是局部最大值。说你想找到最大值会让你看起来好像想要全局最大值(在这种情况下是 7)。
你需要更清楚你的目标。看起来您希望在向量中找到局部最大值。
你是否总是有你希望找到的具有局部最大值的向量(不是真正的数组,通常是一个表示具有两个非单位维度的事物的词)?你会选择找到所有的局部最大值吗?如果是这样,那么这将工作......
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];
你现在想看什么?
同样,您需要考虑您的要求。你有什么需求。目标是什么?
一旦你这样做了,那么你的问题将更容易解决,也更容易有人回答。
我假设您正在寻找局部最大值 - 即大于它们周围的值。
我的解决方案是这样的:
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);
你想找到 4,5 和 7 的每一次出现吗?尝试:
Output = find(A>3)
这将返回一个 1xN 向量,其位置超过 3...虽然不确定这是否是您想要的