F# 使用array.fold(以F为单位)的累积和#
我有一个以下类型的数组F# 使用array.fold(以F为单位)的累积和#,f#,F#,我有一个以下类型的数组 let myarray = [| 1 .. 5 |] 我想得到另一个数组,其中每个元素都是前面元素的累积和: let mycumarray = [| 1 3 6.. 15 |] 我想做的是: let sumArray array = Array.fold (fun acc elem -> acc + elem) 0.0 array let mycumarray = sumArray myarray 但是,它不起作用。有人对获取累积值有什么建议吗?我想您正在寻找
let myarray = [| 1 .. 5 |]
我想得到另一个数组,其中每个元素都是前面元素的累积和:
let mycumarray = [| 1 3 6.. 15 |]
我想做的是:
let sumArray array = Array.fold (fun acc elem -> acc + elem) 0.0 array
let mycumarray = sumArray myarray
但是,它不起作用。有人对获取累积值有什么建议吗?我想您正在寻找的是
数组。scan
,它非常类似于数组。fold
,但返回所有状态值,而不仅仅是最后一个:
(Array.scan (+) 0 myArray).[1..]
[1..]
是数组切片器符号(),用于删除第一个元素,这是必要的,因为扫描
在输出中包含初始状态。数组。扫描
肯定是最佳解决方案,但如果您希望这样,可以使用折叠
:
let cumList xs =
List.ofSeq xs
|> List.fold (fun (acc, ys) elem ->
let acc' = acc + elem
in (acc', ys @ [acc']))
(0, [])
|> snd
|> List.toArray
以下是您的示例:
> cumList [|1..5|];;
val it : int [] = [|1; 3; 6; 10; 15|]
请注意,@
不是最佳的,但它很好地显示了所做的事情(如果性能很重要,您可以使用列表。折叠或执行::
,然后使用最终的列表.rev
,以获得正确的顺序
您还可以使用数组。直接附加,而不是@
使示例在数字上通用:
您只需将函数内联
,并使用GenericZero
而不是0
(假定为int
)
顺便说一句:这也适用于数组。扫描方法:
let inline cumList2 xs =
Array.scan (+) LanguagePrimitives.GenericOne xs
备注如果您只是从1
开始而不是从0
!开始而不是从0开始,则在这种情况下不需要数组切片。可以获取数组的第一个元素:array.scan(+)myArray。[0]但是需要知道数组不是empty@FoggyFinder这不会产生正确的结果,因为第一个条目添加了两次。它可能是Array.scan(+)myArray。[0]myArray。[1..]
。无论如何,使用[1..]的任何版本
切片器将在空数组上出现索引自动失效异常
,因此应检查是否可能出现这种情况。哦,当然。我很匆忙。感谢您更正了我的回答卡斯滕,谢谢您的回答。如果我的列表是浮动的,我将如何编辑上述代码:cumList[| 1.0..5.0 |]?您只需将(0,[])
更改为(0.0,[])
,或者您可以将其用于数字-我将添加此项
let inline cumList2 xs =
Array.scan (+) LanguagePrimitives.GenericOne xs