В .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)
Это не будет работать для данных вВаша диаграмма, потому что она упрощена, но она должна дать вам кое-что для начала.На практике вам, вероятно, потребуется добавить некоторое сглаживание (чтобы не идентифицировать все пики как локальные минимумы / максимумы).