我想在ocaml中创建三维数组。这就是我试图做的事情:
let dp = Array.make n (Array.make n (Array.make k (-1))
然而它不起作用 - 改变值dp [0] [0] [0]改变所有值dp [i] [j] [0]。那么如何使用不同的数组创建矩阵,而不是使用相同的数组?
答案 0 :(得分:10)
Array.make n v
只会复制第二个参数n
次。换句话说,它会在一个循环中为每个元素分配它。由于数组(以及所有其他堆分配的值)通过引用传递,因此所有单元格都将指向同一个数组。您需要使用Array.init
函数,该函数将为每个元素调用用户提供的函数:
let dp = Array.init n (fun _ -> Array.init n (fun _ -> (Array.make k 0)))
但是,对于真正的多维数字代码,您不应该使用数组,而是使用Bigarray
模块。这是一个例子:
open Bigarray
let dp = Array3.create int c_layout 3 3 3
dp.{0,0,0} <- 1