如何将函数应用于浮点数组?

fs_*_*ech 2 f#

假设我有n个数组,其中n是一个变量(某个数字大于2,通常小于10).

每个数组都有k个元素.

我还有一个长度为n的数组,其中包含一组权重,用于指示我如何线性组合所有数组.

我正在尝试创建一个高性能的高阶函数,以便在F#中组合这些数组.

我怎么能这样做,以便我得到一个函数,它接受一个数组(arrs是一个样本),一个权重数组(权重),然后根据权重计算一个加权和?

let weights = [|.6;;.3;.1|]

let arrs = [| [|.0453;.065345;.07566;1.562;356.6|] ; 
              [|.0873;.075565;.07666;1.562222;3.66|] ; 
              [|.06753;.075675;.04566;1.452;3.4556|] |]
Run Code Online (Sandbox Code Playgroud)

谢谢你的想法.

kvb*_*kvb 6

这是一个解决方案:

let combine weights arrs =
  Array.map2 (fun w -> Array.map ((*) w)) weights arrs 
  |> Array.reduce (Array.map2 (+))
Run Code Online (Sandbox Code Playgroud)

编辑

这里有一些(非常需要的)解释它是如何工作的.从逻辑上讲,我们希望执行以下操作:

  1. 将每个重量应用到相应的行.
  2. 将重量调整的行加在一起.

上面的两行就是这样做的.

  1. 我们使用该Array.map2函数来组合相应的权重和行; 我们将它们组合在一起的方法是将行中的每个元素乘以权重,这是通过内部实现的Array.map.
  2. 现在我们有一组加权行,需要将它们加在一起.我们可以一步一步地保持运行总和,依次添加每个数组.我们逐点求和两个数组的方法是Array.map2再次使用,(+)作为组合每个元素的函数.我们将它包装成一个Array.reduce从第一行开始依次将此添加函数应用于每一行.

希望这是一个相当优雅的解决问题的方法,尽管无点的风格无疑使得它有点棘手.但请注意,它并不是特别高效; 做就地更新,而不是与每个应用程序创建新的阵列map,map2以及reduce会更有效.不幸的是,标准库不包含这些操作的良好类似物,这些操作就地工作.然而,创建这样的类似物相对容易,并且它们的使用方式几乎与我在这里完成的方式相同.