F#中的matlab“diff”(逐个元素减去)

时间:2018-05-27 12:55:30

标签: matlab f#

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

导致相同的List,但我觉得应该是一个更好的方法如何在F#中做差异?在那儿?

2 个答案:

答案 0 :(得分:4)

其中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)

答案 1 :(得分:1)

使用序列而不是列表有一个紧凑的解决方案:

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

如果您希望结果为列表。