F#jagged数组赋值

时间:2016-11-14 01:35:27

标签: f# jagged-arrays

我的行为很奇怪 - 当我为锯齿状数组分配单个值时,它会改变整个列的值。

let testArray = Array.create 5 (Array.create 5 nan)
testArray.[3].[3] <- 1.0

上面的代码不是更改单个单元格的值,而是更改整个列的值。

val it : float [] [] =
  [|[|nan; nan; nan; 1.0; nan|]; [|nan; nan; nan; 1.0; nan|];
  [|nan; nan; nan; 1.0; nan|]; [|nan; nan; nan; 1.0; nan|];
  [|nan; nan; nan; 1.0; nan|]|]

1 个答案:

答案 0 :(得分:13)

这是因为您没有创建二维数组(正如我所假设的那样),而是您正在创建两个数组:一个数组中包含5个nan s ,以及另一个数组,其中包含5个对第一个数组的引用。只是为了说明这个问题,下面的代码完全等同于你的代码:

let firstArray = Array.create 5 nan
let testArray = Array.create 5 firstArray
testArray.[3].[3] <- 1.0

因此,行testArray.[3].[3] <- 1.0实际上只更改了一个元素 - firstArray中的第四个元素,但如果您尝试打印testArray,则同一元素会多次显示,因为有firstArray的多个引用。

如果你想创建一个包含五个不同数组的数组,你需要使用Array.init,而不是元素采用&#34;创建下一个元素&#34;功能:

let testArray = Array.init 5 (fun _ -> Array.create 5 nan)

或者,您可以使用list comprehension创建数组:

let testArray = [|for i in 1..5 -> Array.create 5 nan|]

两者都会给你相同的结果,不过第一个会有更好的表现。

如果你真的需要使用二维数组(而不是数组数组),你可能想要看一下Array2D

let testArray = Array2D.create 5 5 nan
testArray.[3,3] <- 1.0