Получить локальные минимальные и максимальные значения из массива данных - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть дата / какой-то массив значений.Когда я рисую его в виде графика, он выглядит так:

enter image description here

Я бы хотел найти его минимальные и максимальные точки.Я подписал их синими точками на моем графике выше.

Есть ли встроенная поддержка в .net / linq / c # / f # для получения локальных минимальных максимальных значений массива / списка?Я гуглил эту тему.Я просто хочу дважды проверить это перед тем, как кодировать его самостоятельно и перед тем, как заново изобретать колесо.

Pls.проверьте мой пример диаграммы и синие точки на нем, это не просто получение минимальных максимальных значений из массива!

Ответы [ 3 ]

2 голосов
/ 08 ноября 2011

В .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)

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

0 голосов
/ 08 ноября 2011

с помощью Linq попробуйте что-то вроде этого:

YourArray.Where(/*your condition for a "local" portion of the array*/).Min(t => t.Date);
YourArray.Where(/*your condition for a "local" portion of the array*/).Max(t => t.Date);
0 голосов
/ 08 ноября 2011

Вы должны были бы написать это вручную, так как для вычисления локальных минимумов / максимумов у вас должно быть несколько параметров, таких как сроки, скорость изменения и т. Д. Существуют алгоритмы, которые вы можете использовать для этого, но это не реализовано в библиотеках .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...