OCaml-声明n维数组

OCaml-声明n维数组,ocaml,Ocaml,我想在ocaml中创建三维数组。以下是我试图做的: let dp = Array.make n (Array.make n (Array.make k (-1)) 但是它不起作用-更改值dp[0][0][0]会更改所有值dp[i][j][0]。那么,如何使用不同的数组而不是相同数组的副本创建矩阵呢?Array.make n v将只复制第二个参数n次。换句话说,它将在一个循环中将其分配给每个元素。由于数组(以及所有其他堆分配的值)是通过引用传递的,所以所有单元格都将指向同一数组。您需要使用Arr

我想在ocaml中创建三维数组。以下是我试图做的:

let dp = Array.make n (Array.make n (Array.make k (-1))

但是它不起作用-更改值dp[0][0][0]会更改所有值dp[i][j][0]。那么,如何使用不同的数组而不是相同数组的副本创建矩阵呢?

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
openbigarray
设dp=Array3。创建内部c_布局3
dp.{0,0,0}请看:。引用此url:新数组的分配分为两个阶段。首先,计算初始值;然后将该值写入新数组的每个元素中。这就是为什么Array.make 3 0分配的行是唯一的,并且由数组m的所有行物理共享。