一尘不染

在动态范围内查找局部最大值

algorithm

在C#中工作,我需要在Doubles列表中找到所有本地峰值,并在另一个List
Doubles中返回它们。如果在给定的“窗口”值中有一组要比较的值,这似乎很简单,但是我需要能够将此窗口大小实际传递给函数本身。这可能令人困惑,但是基本上我需要这样的东西:

public List<double> FindPeaks(List<double> values, double rangeOfPeaks)

如果“
rangeOfPeaks”为5,则将“当前”值与它的每一侧的2个值进行比较,以确定它是否是峰值。如果’rangeOfPeaks’为11,则将当前值与每一侧的5个值进行比较。我认为这是一个非常基本的算法,但是,我一直没有找到能够检测到这种峰的任何好的方法。有人做过吗?任何帮助将不胜感激。提前致谢!


阅读 267

收藏
2020-07-28

共1个答案

一尘不染

可能有更有效的方法,但是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;
    }
2020-07-28