【问题标题】:List.unfold/Array.unfold causes memory blowoutList.unfold/Array.unfold 导致内存爆裂
【发布时间】:2018-06-08 21:46:32
【问题描述】:

朋友们,以下代码在使用 Seq.unfold 时运行良好。但是,List.unfold 或 Array.unfold(如下所示)会导致程序永远不会终止。我主要只是好奇为什么会这样。但是,我一般倾向于只使用数组。谁能解释这种行为的原因是什么,如果可能的话,如何在数组的范围内解决这个一般结构的问题。

open MathNet.Numerics.LinearAlgebra
open MathNet.Numerics.Distributions

let randn() = Normal.Sample(0., 1.)
let N = 100
let y = DenseVector.init N (fun _ -> 10. + sqrt(1.) * randn())
let SIM = 
    Array.unfold (fun (c1_, c2_) ->
        let D  = 1./(1. / 100. + float(N) / c2_)
        let c1 = D *(0. / 100. + y.Sum() / c2_) + sqrt(D) * randn() 
        let a1 = (3. + float(N) / 2.)
        let a2 = (0.5 + ((y-c1).PointwisePower(2.)).Sum() / 2.)
        let c2  = InverseGamma.Sample(a1, a2)
        Some((c1_, c2_), (c1, c2))
    ) (0., 1.)
    |> Array.take (100000)
let result = SIM |> Array.map (fun (i, j) -> i) 

【问题讨论】:

    标签: f# mathnet-numerics math.net


    【解决方案1】:

    我认为问题是由您的生成器引起的,因为它永远不会通过返回 None 来终止展开算法。

    您的代码正在使用Seq,因为序列是延迟评估的,Seq.unfold 仅在您尝试从序列中读取值时执行生成器。生成器永远不会终止这一事实不是问题,因为序列可以是无限的。

    另一方面,列表和数组不会被延迟计算,并且生成器会一直运行直到它返回None。使用您的生成器,您最终会得到一个“无限循环”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-03
      • 2010-11-22
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多