Велоспорт трубопроводов - PullRequest
       10

Велоспорт трубопроводов

2 голосов
/ 26 февраля 2011

У меня есть матрица: 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 

где n = Array2D.матрица length1 - 1
Как я могу реализовать этот конвейер?

1 Ответ

5 голосов
/ 26 февраля 2011

С макушки моей головы:

{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

Внутри сгиба М обозначает промежуточный результат на каждом шаге. Может потребоваться некоторое время, чтобы понять, как сгибы работают, но как только вы это сделаете, они довольно мощные.

...