所以基本上我有一个1D数组,它有500多个值,浮动在100-130的范围内,或者没有特定的顺序(它是随机的);我想知道如何找到这些数据的峰和谷。有没有办法改变峰值检测的灵敏度?什么是这方面的综合算法?如果有一个js库,那就太棒了。

最佳答案

一个寻找波峰和波谷的算法,基本上和你看图表时用手指做的一样你从一开始就沿着这条线走,当你看到一个高峰和一个低谷时就要注意。
从程序上来说,我们可以这样定义:
对于某些长度为n的数组(其中n-1是最后一个元素的索引,0是第一个元素的索引),从1n-2进行完全迭代然后,波峰和波谷将被定义为:
对于元素i,如果i-1 > ii+1 > i。那么i就是一个槽。
对于元素i,如果i-1 < ii+1 < i。然后i是一个峰值。
这将是一个O(n)算法,并且有足够的信息来编程。
下面是实现上述算法的示例程序:

var array = [102,112,115,120,119,102,101,100,103,105,110,109,105,100];

function findPeaksAndTroughs(array) {
  var start = 1;                        // Starting index to search
  var end = array.length - 2;           // Last index to search
  var obj = { peaks: [], troughs: []  };// Object to store the indexs of peaks/thoughs

  for(var i = start; i<=end; i++)
  {
    var current = array[i];
    var last = array[i-1];
    var next = array[i+1];

    if(current > next && current > last)
    	obj.peaks.push(i);
    else if(current < next && current < last)
    	obj.troughs.push(i);
  }
  return obj;
}

console.log(findPeaksAndTroughs(array));

07-26 06:30