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#中做差异?在那儿?
答案 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
如果您希望结果为列表。