2

私は行列を持っています: Array2D と関数

let DivideAndSubstract value index (matrix: float[,]) = 
    //something that returns a matrix

したがって、この関数を次のようにマトリックスに n 回適用する必要があります。

matrix  
|> DivideAndSubstract matrix.[0,0] 0  
|> DivideAndSubstract matrix.[1,1] 1  
|> DivideAndSubstract matrix.[2,2] 2  
....  
|> DivideAndSubstract matrix.[n,n] n 

where n = Array2D.length1 matrix - 1
このパイプラインを実装するにはどうすればよいですか?

4

1 に答える 1

5

頭のてっぺんから:

{0..n} |> Seq.fold (fun M k -> DivideAndSubtract matrix.[k,k] k M) matrix

編集:さらにいくつかの言葉が答えを傷つけることはありません:

折り畳みの使用は、「F を x に適用し、F を結果に適用し、その結果に F を適用する ... F を再度適用する必要がなくなるまで」という典型的なパターンです。上記の行の命令バージョンは次のようになります

let mutable M = matrix
for k in 0..n do
    M <- DivideAndSubtract matrix.[k,k] k M
M

折り畳みの内側では、M は各ステップでの中間結果を示します。折り畳みがどのように機能するかを理解するにはしばらく時間がかかるかもしれませんが、一度理解してしまえば、折り畳みは非常に強力です。

于 2011-02-26T12:06:43.467 に答える