用数组填充数组不能按我预期的那样工作

ten*_*ten 4 arrays julia

我想制作一个多数组,其条目是多数组,并且想将某个数组一个一个地推入条目中。

例如,我创建了 2 x 3 Matrixarr并尝试用由randn(4,4).

arr = fill(Matrix{Float64}[], 2, 3)
push!(arr[1,1],randn(4,4))
push!(arr[1,2],randn(4,4))
println(arr[1,1])
println(arr[1,2])
println(arr[1,3])

Run Code Online (Sandbox Code Playgroud)

然而,结果是arr(除了 [1,1] 和 [1,2])的所有条目都填充了相同的randn(4,4),而不仅仅是 [1,1] 和 [1,2] 填充了randn(4,4)

[[-0.15122805007483328 0.6132236453930502 -0.9090110366765862 1.2589924202099898; -1.120611384326006 -0.9083935218058066 0.7252290006516056 1.0970416725786256; -0.19173238706933265 1.3610525411901113 -0.05258697093572793 0.7776085390912448; 0.18491459001855373 -2.0537142669734934 0.3482557186126859 0.0047622478008474845], [0.23422967703060255 -0.51986351753462 0.45947166573674303 0.31316899298864387; 0.3704450103622709 -0.8186574197233013 -0.9990329964554037 -0.8345957519924763; 0.56641529964098 -0.8393435538481216 -0.6379336546939682 1.1843452368116358; 0.9435767553275002 0.0033471181565433127 -1.191611491619908 1.3970554854927264]]
[[-0.15122805007483328 0.6132236453930502 -0.9090110366765862 1.2589924202099898; -1.120611384326006 -0.9083935218058066 0.7252290006516056 1.0970416725786256; -0.19173238706933265 1.3610525411901113 -0.05258697093572793 0.7776085390912448; 0.18491459001855373 -2.0537142669734934 0.3482557186126859 0.0047622478008474845], [0.23422967703060255 -0.51986351753462 0.45947166573674303 0.31316899298864387; 0.3704450103622709 -0.8186574197233013 -0.9990329964554037 -0.8345957519924763; 0.56641529964098 -0.8393435538481216 -0.6379336546939682 1.1843452368116358; 0.9435767553275002 0.0033471181565433127 -1.191611491619908 1.3970554854927264]]
[[-0.15122805007483328 0.6132236453930502 -0.9090110366765862 1.2589924202099898; -1.120611384326006 -0.9083935218058066 0.7252290006516056 1.0970416725786256; -0.19173238706933265 1.3610525411901113 -0.05258697093572793 0.7776085390912448; 0.18491459001855373 -2.0537142669734934 0.3482557186126859 0.0047622478008474845], [0.23422967703060255 -0.51986351753462 0.45947166573674303 0.31316899298864387; 0.3704450103622709 -0.8186574197233013 -0.9990329964554037 -0.8345957519924763; 0.56641529964098 -0.8393435538481216 -0.6379336546939682 1.1843452368116358; 0.9435767553275002 0.0033471181565433127 -1.191611491619908 1.3970554854927264]]
Run Code Online (Sandbox Code Playgroud)

怎么了?任何信息,将不胜感激。

Prz*_*fel 6

当您将arr = fill(Matrix{Float64}[], 2, 3)所有 6 个元素指向内存中完全相同的位置时,因为fill不会进行深度复制 - 它只是复制引用。基本上,fill当第一个参数可变时使用通常不是一个好主意。

因此,您真正想要的是:

arr = [Matrix{Float64}[] for i in 1:2, j in 1:3]
Run Code Online (Sandbox Code Playgroud)

现在每个6插槽在内存中都有自己的地址。