F# List.unfold/Array.unfold导致内存溢出
朋友们,下面的代码在使用Seq.unfold时运行良好。但是,List.unfold或Array.unfold(如下所示)会导致程序永远不会终止。我很好奇为什么会这样。然而,我一般倾向于只使用数组。有人能解释这种行为的原因吗?如果可能的话,如何在数组的范围内处理这种一般结构的问题F# List.unfold/Array.unfold导致内存溢出,f#,mathnet-numerics,math.net,F#,Mathnet Numerics,Math.net,朋友们,下面的代码在使用Seq.unfold时运行良好。但是,List.unfold或Array.unfold(如下所示)会导致程序永远不会终止。我很好奇为什么会这样。然而,我一般倾向于只使用数组。有人能解释这种行为的原因吗?如果可能的话,如何在数组的范围内处理这种一般结构的问题 open MathNet.Numerics.LinearAlgebra open MathNet.Numerics.Distributions let randn() = Normal.Sample(0., 1.)
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)
我认为问题是由生成器引起的,因为它从不通过返回
None
来终止展开算法
您的代码使用的是Seq
,因为序列是惰性计算的,而Seq.unfold
仅当您尝试从序列中读取值时才执行生成器。生成器从不终止这一事实不是问题,因为序列可以是无限的
另一方面,列表和数组不会延迟求值,生成器会一直运行,直到返回None
。使用生成器,您将得到一个“无限循环”