2012-07-11 22 views
1

我需要在F#中實現2D中的簡單動態編程算法。對於簡單的一維病例,Seq.unfold似乎是要走的路,參見例如。 https://stackoverflow.com/a/7986083/5363F中的2D動態編程#

是否有一種很好(有效)的方法來實現2D中的類似結果,例如,用功能樣式重寫以下僞代碼:

let alpha = 
    let result = Array2D.zeroCreate N T 
    for i in 0 .. N-1 do 
     result.[0, i] <- (initialPi i) * (b i observations.[0]) 
    for t in 1 .. T-1 do 
     for i in 0 .. N-1 do 
     let s = row t-1 result |> Seq.mapi (fun j alpha_t_j -> alpha_t_j * initialA.[i, j])() |> Seq.sum 
     result.[t, i] <- s * (b i observations.[t]) 
    result 

假定所有缺少的函數和數組都在上面定義。

+0

什麼是你要改寫這個動機是什麼?這僅僅是爲了教育目的嗎?看起來像上面的陣列版本將是你的最佳投注製作.. – t0yv0 2012-07-11 20:54:45

回答

1

編輯:其實讀代碼,這至少是功能性的,確實有一個稍微不同的返回類型,但你可避免與轉換

let alpha = 
    let rec build prev idx max = 
     match idx with 
     |0 -> 
      let r = (Array.init N (fun i -> (initialPi y) * (b i observations.[0])) 
      r:: (build r 1 max) 
     |t when t=max -> [] 
     |_ -> 
      let s = prev |> Seq.mapi (fun j alpha_t_j -> alpha_t_j * initialA.[i, j])() |> Seq.sum 
      let r = Array.init N (fun i -> s * (b i observations.[t])) 
     r:: build r (idx+1 max) 
    build [] 0 T |> List.toArray  
+0

'result'是我們初始化的陣列雖然... – Grzenio 2012-07-11 11:42:20

+0

@Grzenio這將返回該數組 - 整個事情是一個巨大的數組創建函數所以我不需要命名它 – 2012-07-11 11:49:41

+0

我明白了,但在比賽的第二個例子中,你引用了'result',它在你的版本中是未定義的(它曾經是我的命令版本中創建的數組) – Grzenio 2012-07-11 11:58:27