假设我有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)
谢谢你的想法.
这是一个解决方案:
let combine weights arrs =
Array.map2 (fun w -> Array.map ((*) w)) weights arrs
|> Array.reduce (Array.map2 (+))
Run Code Online (Sandbox Code Playgroud)
编辑
这里有一些(非常需要的)解释它是如何工作的.从逻辑上讲,我们希望执行以下操作:
上面的两行就是这样做的.
Array.map2函数来组合相应的权重和行; 我们将它们组合在一起的方法是将行中的每个元素乘以权重,这是通过内部实现的Array.map.Array.map2再次使用,(+)作为组合每个元素的函数.我们将它包装成一个Array.reduce从第一行开始依次将此添加函数应用于每一行.希望这是一个相当优雅的解决问题的方法,尽管无点的风格无疑使得它有点棘手.但请注意,它并不是特别高效; 做就地更新,而不是与每个应用程序创建新的阵列map,map2以及reduce会更有效.不幸的是,标准库不包含这些操作的良好类似物,这些操作就地工作.然而,创建这样的类似物相对容易,并且它们的使用方式几乎与我在这里完成的方式相同.