【问题标题】:Finding peaks in vector在向量中寻找峰值
【发布时间】:2012-10-17 23:44:37
【问题描述】:

我试图在向量中找到“峰值”,即两侧最近相邻元素的值不同的元素具有较低的值。

所以,例如在向量中

c(0,1,1,2,3,3,3,2,3,4,5,6,5,7)

在 5,6,7,12 和 14 位置有峰值

Finding local maxima and minima 接近,但不太合适。

【问题讨论】:

  • 您给出的链接中的答案有什么问题?即 which(diff(sign(diff(tt)))==-2)+1
  • 它只返回12,因为这是唯一一个直接相邻元素的值都较低的元素。
  • 很好的问题,也感谢您通过这个出色的链接展示您的想法/研究。

标签: r


【解决方案1】:

这应该可以。对diff(sign(diff(x)) == -2 的调用实质上是通过在rle 挑选的每个唯一值处/周围测试负二阶导数来找到峰值。

x <- c(0,1,1,2,3,3,3,2,3,4,5,6,5,7)

r <- rle(x)
which(rep(x = diff(sign(diff(c(-Inf, r$values, -Inf)))) == -2, 
          times = r$lengths))
# [1]  5  6  7 12 14

(我用-Infs 填充了您的向量,以便元素 1 和 14 都有匹配的可能性,如果最近的不同值元素具有较低的值。您显然可以通过以下方式调整末端元素匹配规则而是将其中一项或两项设置为Inf。)

【讨论】:

  • ... 我现在才点击链接的问题,发现 Ben Bolker 和 Tommy 使用了与我在这里所做的基本相同的方法和解释!我想这是一个迹象,表明你可以做到这一点。
  • 就像我说的:它接近我想要的,但我不知道如何改变它来实现我想要的。感谢您花时间解释您的解决方案是如何工作的!
猜你喜欢
  • 2015-02-10
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多