一千萬個為什麽

搜索

從數據數組中獲取本地最小值和最大值

我有一個日期/某種值數組。當我將其繪制為圖表時,它看起來像這樣:

enter image description here

我想找到它的當地最低和最高分。我在上面的圖表上用藍點簽名。

在.net/linq/c#/ f#中是否有內置支持來獲取數組/列表的本地最小值?我用Google搜索了這個話題。我只是想在我自己編碼之前和重新發明輪子之前仔細檢查它。

PLS。檢查我的樣本圖表及其上的藍點,這不僅僅是從數組中獲取最小值的簡單值!

最佳答案

.NET(或F#庫)中沒有內置函數可以自動執行此操作。

為了給你一些初步的想法 - 如果你只有精確的數據(即忽略圖表中的小峰值),在F#中解決這個問題很容易,這樣數組中沒有兩個跟隨值是相同的。

在這種情況下,您可以通過查找以下三個值來找到最小值,使得中間值小於前一個值並且還小於下一個值。這會檢測如下形狀:

__  __
  \/

例如,如果您有包含數據的 values ,則可以編寫:

let values = [ 1.0; 2.0; 1.5; 1.0; 4.0; 2.0 ]
// Add indices as the first element of a tuple (so that we can identify positions)
let valuesIndexed = values |> Seq.mapi (fun i v -> i, v)

// Use 'windowed' to create sliding window of size 3 and then 'choose'
// indices where previous value and following value are both larger
let mins = 
  valuesIndexed |> Seq.windowed 3 |> Seq.choose (fun arr ->
    match arr.[0], arr.[1], arr.[2] with
    | (_, vpre), (i, v), (_, vpost) when vpre > v && vpost > v -> Some i
    | _ -> None)

這不適用於圖表中的數據,因為它過於簡單,但它應該為您提供一些東西。在實踐中,您可能需要添加一些平滑(以避免將所有尖峰識別為局部最小值/最大值)。

轉載註明原文: 從數據數組中獲取本地最小值和最大值