F# - 数组 - 减去N-1个元素

时间:2017-12-03 15:48:47

标签: arrays f#

我试图使用常量和两个数组减去n-1元素作为计算的一部分,如下所示:

module SOQN =

   open System

   let firstArray  = [|0.02;0.03;0.05;0.07;0.11|]
   let secondArray = [|0.30;0.50;0.70;1.10;1.30|]
   let constant    = 0.37

   let minusOneElement = 0.00
   let result = Array.map2 (fun x y -> (x - (constant * (y - minusOneElement)))) firstArray secondArray

   printfn "Result: %A" result

   (*
      Expected Result: [|-0.091;-0.044;-0.024;0;0|]
      Actual Result:   [|-0.091;-0.155;-0.209;-0.337;-0.371|]
   *)

正如你所看到的,第一个输出值是正确的,但其余部分没有给出我不知道如何构造" minusOneElement",这应该是" secondArray&#34的连续元素; - 即0.30 0.50 0.70和1.10。还有一个额外的限制是" secondArray"少于一个;否则,相应的结果值设置为零。

3 个答案:

答案 0 :(得分:2)

如果我正确地解释了您的要求,您希望获取第二个数组并生成对(当前元素,前一个元素),其中前一个元素对于第一个当前元素设置为0.0。

您可以使用Seq.windowed生成对(在为前一个元素添加0.0的单例数组之后):

let fst  = [|0.02;0.03;0.05;0.07;0.11|]
let snd = [|0.30;0.50;0.70;1.10;1.30|]
let snd' = Seq.windowed 2 (Array.append [|0.0|] snd) |> Seq.toArray
let constant = 0.37

修改地图操作:

let result = Array.map2 (fun x (y: float []) -> (if y.[1] < 1.00 then (x - (constant * (y.[1] - y.[0]))) else 0.00)) fst snd'

这会产生您的预期结果(请注意snd&#39;对以供参考):

val snd' : float [] [] =
    [|[|0.0; 0.3|]; [|0.3; 0.5|]; [|0.5; 0.7|]; [|0.7; 1.1|]; [|1.1; 1.3|]|]

val result : float [] = [|-0.091; -0.044; -0.024; 0.0; 0.0|]

答案 1 :(得分:1)

以下代码段似乎有效:

if let location = record["location"] as? CLLocation {
    annotation.coordinate = location.coordinate
}

如果可能的话,我会很感激一种更惯用的解决方案。

答案 2 :(得分:1)

对于每个int(Twice, int),构造一个元组及其与y.[n]的区别。实现此功能的方法是y.[n-1]操作,该操作使用scan的中间结果填充集合。与fold(或者就此而言,Seq.windowed)相比,生成的集合的长度不小于源。它包含一个额外的元素,初始状态是前置的。

Seq.pairwise