我有一个日期/某种值数组。当我将其绘制为图表时,它看起来像这样:
我想找到它的当地最低和最高分。我在上面的图表上用蓝点签名。
.net / linq / c#/ f#中是否有内置支持来获取数组/列表的本地最小值?我用Google搜索了这个话题。我只是想在我自己编码之前再重新检查它,然后重新发明轮子。
PLS。检查我的样本图表及其上的蓝点,这不仅仅是从数组中获取最小值的简单值!
答案 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);