从数据数组中获取本地最小值和最大值

时间:2011-11-07 23:37:59

标签: c# .net arrays list f#

我有一个日期/某种值数组。当我将其绘制为图表时,它看起来像这样:

enter image description here

我想找到它的当地最低和最高分。我在上面的图表上用蓝点签名。

.net / linq / c#/ f#中是否有内置支持来获取数组/列表的本地最小值?我用Google搜索了这个话题。我只是想在我自己编码之前再重新检查它,然后重新发明轮子。

PLS。检查我的样本图表及其上的蓝点,这不仅仅是从数组中获取最小值的简单值!

3 个答案:

答案 0 :(得分:2)

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

这不适用于图表中的数据,因为它过于简单,但它应该为您提供一些东西。在实践中,您可能需要添加一些平滑(以避免将所有尖峰识别为局部最小值/最大值)。

答案 1 :(得分:0)

你必须手动编写这个,因为要计算局部最小值/最大值你需要考虑多个参数,比如时间范围,变化率等等。你可以使用算法来做到这一点,但它没有在.NET库中实现。

答案 2 :(得分:0)

使用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);