一千萬個為什麽

搜索

在動態範圍內查找局部最大值

在C#中工作,我需要在雙精度列表中找到所有本地峰值,並將它們作為另一個列表雙精度返回。這看起來很簡單,如果我在任何給定的“窗口”值中有一組我正在比較的值,但我需要能夠將這個窗口大小實際傳遞給函數本身。這可能令人困惑,但基本上我需要這樣的東西:

public List FindPeaks(List values, double rangeOfPeaks)

如果'rangeOfPeaks'為5,則將'current'值與其每一側的2個值進行比較,以確定它是否為峰值。如果'rangeOfPeaks'為11,則將當前值與每側的5個值進行比較。我認為這是一個非常基本的算法,但是,我找不到像這樣檢測峰值的任何好方法都沒有成功。有沒有人曾經這樣做過?任何幫助都將不勝感激。提前致謝!

最佳答案

可能有更有效的方法,但LINQ使這非常簡單

    static IList FindPeaks(IList values, int rangeOfPeaks)
    {
        List peaks = new List();

        int checksOnEachSide = rangeOfPeaks/2;
        for (int i = 0; i < values.Count; i++)
        {
            double current = values[i];
            IEnumerable range = values;
            if( i > checksOnEachSide )
                range = range.Skip(i - checksOnEachSide);
            range = range.Take(rangeOfPeaks);
            if (current == range.Max())
                peaks.Add(current);
        }
        return peaks;
    }

轉載註明原文: 在動態範圍內查找局部最大值