0
我发现这个neat trick计算的平均值和标准差在一遍数据。我想要这个工作float32
和float
。 Again,我很努力地用通用数字来解决这个问题。如何统一这两个浮点函数?
module Seq =
let inline private avgVarianceReducer toFloat (count, oldM, oldS) x =
if count = 1 then
2, x, LanguagePrimitives.GenericZero
else
let meanFree = x - oldM
let newM = oldM + meanFree/(toFloat count)
count + 1, newM, oldS + meanFree * (x - newM)
let inline private avgVarianceWith toFloat source =
match source |> Seq.fold (avgVarianceReducer toFloat) (1, LanguagePrimitives.GenericZero, LanguagePrimitives.GenericZero) with
| 0, _, _ -> LanguagePrimitives.GenericZero, LanguagePrimitives.GenericZero
| 1, mean, _ -> mean, LanguagePrimitives.GenericZero
| n, mean, var -> mean, var/(n - 2 |> toFloat)
let avgVariance source = source |> avgVarianceWith float
let avgVariancef source = source |> avgVarianceWith float32
这适用于这两种类型,但我有额外的加avgVariancef
我不得不选择打电话的时候是正确的。
对我来说,核心问题是转换到avgVarianceReducer
一种权利浮动的,我通过传递正确的转换funtion解决。我尝试了op_Explicit
,但失败了。
人有一个更优雅的解决方案的想法?