Matlab "diff" в F # (вычитать элемент за элементом) - PullRequest
0 голосов
/ 27 мая 2018

В MATLAB есть функция diff , которая вычисляет разницу между элементами в векторе (или в матрице, но это не так).

X = [1 1 2 3 5 8 13 21];
Y = diff(X)

Результат: 0 1 1 2 3 5 8

Я придумал решение F #:

let x =[1;1;2;3;5;8;13;21]
let diff x = List.map2 (-) (x|> List.tail) (x|> List.take ((x|>List.length) - 1))

diff x

, которое приводит к тому же списку, но я чувствую, что должен быть лучшим способом, как сделать разницу вF #?Есть?

Ответы [ 2 ]

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

Для работы с последовательностями вместо списков существует компактное решение:

let diff x = Seq.map2 (-) (Seq.skip 1 x) x

Это не будет работать со списками, поскольку List.map2 требует, чтобы его аргументы имели одинаковую длину.Seq.map2 не имеет этого требования.

Для вашего конкретного случая вы можете сделать:

[1;1;2;3;5;8;13;21] |> diff |> List.ofSeq

, если хотите, чтобы результат был списком.

0 голосов
/ 27 мая 2018

Там есть List.pairwise : 'T list -> ('T * 'T) list, который дает вам список последовательных пар предметов.

let x =[1;1;2;3;5;8;13;21]

let diff x =
    x |> List.pairwise |> List.map (fun (x, y) -> y - x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...