2012-07-11 3 views
1

F #의 2D에서 간단한 동적 프로그래밍 알고리즘을 구현해야합니다. 간단한 1D의 경우 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

답변

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

+0

@Grzenio이 배열을 반환합니다 - 모든 것은 거대한 배열 생성 함수입니다 그래서 나는 그것을 이해할 필요가 없다. –

+0

성냥의 두 번째 경우에, 당신의 버전에서 정의되지 않은'result'를 참조한다. (그것은 나의 명령형으로 생성 된 배열이다.) – Grzenio