gpt4 book ai didi

f# - 在 f# 中连接二维数组

转载 作者:行者123 更新时间:2023-12-04 18:08:57 24 4
gpt4 key购买 nike

通常如何组合两个二维数组?

我的假设(我显然可以很容易地对此进行测试)是它们始终具有相同的列数:

let concatArrays (arr1:obj[,]) (arr2:obj[,]) = 
([arr1; arr2]) |> Array2d.concat

虽然这个功能不存在。为了清楚起见,结果应该生成一个二维数组,其长度 = 长度之和,列数与原始数组 2D 相同,并且应该与输入的类型相同,这里是 obj[,]。我显然可以在循环结构中做到这一点,但我想知道 f# 方式。谢谢。

我试过这个:
let append2D (arr1:float[,]) (arr2:float[,]) = 
let cls = arr1.GetLength 1
let rows1 = arr1.GetLength 0
let rows2 = arr2.GetLength 0
Array2D.init (rows1+rows2) cls (fun i j -> match i with | a when a <= rows1 -> arr1.[i,j] | _ -> arr2.[i,j])

但这又带来了索引越界错误。

最后一行的更新:
 Array2D.init (rows1+rows2) cls (fun i j -> if i < rows1 then arr1.[i,j] else arr2.[i,j])  

更新工作解决方案:
 Array2D.init (rows1+rows2) cls (fun i j -> if i < rows1 then arr1.[i,j] else arr2.[i-rows1,j])  

谢谢大家

最佳答案

关注此 recommendation这是一个 concat两个相等列大小的函数 Array2D任何类型的参数 'a :

let concat (a1: 'a[,]) (a2: 'a[,]) =
let a1l1,a1l2,a2l1,a2l2 = (Array2D.length1 a1),(Array2D.length2 a1),(Array2D.length1 a2),(Array2D.length2 a2)
if a1l2 <> a2l2 then failwith "arrays have different column sizes"
let result = Array2D.zeroCreate (a1l1 + a2l1) a1l2
Array2D.blit a1 0 0 result 0 0 a1l1 a1l2
Array2D.blit a2 0 0 result a1l1 0 a2l1 a2l2
result

您可以通过实验进行检查,但与基于 Array2D.init 的任何变体相比,它的性能要好几倍。因为 Array2D.zeroCreateArray2D.blit实现是高度优化的。

关于f# - 在 f# 中连接二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19402376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com