List.unfold / Array.unfold вызывает выброс памяти - PullRequest
0 голосов
/ 09 июня 2018

Друзья, следующий код работает нормально при использовании 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) 

1 Ответ

0 голосов
/ 09 июня 2018

Я думаю, что проблема вызвана вашим генератором, поскольку он никогда не завершает алгоритм развертывания, возвращая None.

Ваш код работает с Seq, потому что последовательности вычисляются лениво, а Seq.unfold выполняетГенератор только при попытке прочитать значение из последовательности.Тот факт, что генератор никогда не завершается, не является проблемой, потому что последовательности могут быть бесконечными.

С другой стороны, списки и массивы не лениво вычисляются, и генератор работает до тех пор, пока не вернется None.С вашим генератором вы получите «бесконечный цикл».

...