在F#中将int[,]转换为int[][]的简单方法

3
我们有两个数组。
let a = [| [|1|] |]

并且

let a' = Array2D.init 1 1 (fun x y -> 1)

第一个返回 int [][],第二个返回 int [,]。

有没有简单的方法将 int[,] 转换为 int[][]?

2个回答

3

没有内置的函数可以完成这个任务。我建议使用列表推导式语法,这似乎很简单:

let a =
   [| for i in 0..(Array2D.length1 a' - 1) ->
         [| for j in 0..(Array2D.length2 a' - 1) -> a'.[i,j] |] |]

需要注意的一点是基础索引。在您的示例中,数组是以零为基础的,因此我使用零只是为了使代码更短。但是,如果您需要支持非以零为基础的数组情况,则必须使用 a'.[ i + Array2D.base1 a', j + Array2D.base2 a' ]。这不太优雅,但是你能怎么办呢。


2
它差不多是正确的答案,只需在Array2D.length上再减去一对-1,你就正确了。现在这样我得到了一个IndexOutOfRangeException异常。感谢你的回答。 - Thanos Papathanasiou
4
好的,没错。抱歉,我是用手机写的,无法验证代码。 - Fyodor Soikin

1
如果您对数组的构建感兴趣,您可以使用两个Array.init来构建[][](也称为不规则数组)形式。
例如: Array.init 10 (fun r -> Array.init 20 (fun c -> (c+r))) [|[|0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19|]; [|1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20|]; [|2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21|];...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接