在C#中工作,我需要在Doubles列表中找到所有本地峰值,并在另一个List Doubles中返回它们。如果在给定的“窗口”值中有一组要比较的值,这似乎很简单,但是我需要能够将此窗口大小实际传递给函数本身。这可能令人困惑,但是基本上我需要这样的东西:
public List<double> FindPeaks(List<double> values, double rangeOfPeaks)
如果“ rangeOfPeaks”为5,则将“当前”值与它的每一侧的2个值进行比较,以确定它是否是峰值。如果’rangeOfPeaks’为11,则将当前值与每一侧的5个值进行比较。我认为这是一个非常基本的算法,但是,我一直没有找到能够检测到这种峰的任何好的方法。有人做过吗?任何帮助将不胜感激。提前致谢!
可能有更有效的方法,但是LINQ使这一过程变得非常简单
static IList<double> FindPeaks(IList<double> values, int rangeOfPeaks) { List<double> peaks = new List<double>(); int checksOnEachSide = rangeOfPeaks / 2; for (int i = 0; i < values.Count; i++) { double current = values[i]; IEnumerable<double> range = values; if( i > checksOnEachSide ) range = range.Skip(i - checksOnEachSide); range = range.Take(rangeOfPeaks); if (current == range.Max()) peaks.Add(current); } return peaks; }