【发布时间】:2016-06-16 23:30:25
【问题描述】:
我发现这个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 中转换为正确的浮点数,我通过传入正确的转换函数解决了这个问题。我尝试了op_Explicit,但失败了。
有人想出更优雅的解决方案吗?
【问题讨论】:
标签: generics f# numbers type-conversion type-inference