[英]Assignment to multidimensional array in julia
以下简单的代码返回,在我看来,一个意外的结果:
srand(101)
# create a multidimensional array that will house 3 matrices of dimensions 2x2
A = Array(Array{Float64,2},3)
# initialise array with zero matrices (is this the culprit?)
fill!(A, zeros(2,2))
# populate array (some dummy computation to illustrate my problem)
for ii=1:2
for jj=1:2
aux = randn(1,3)
for dd=1:3
A[dd][ii,jj]=aux[dd]
end
end
end
当我运行上面的代码时,我的数组A读取:
3-element Array{Array{Float64,2},1}:
2x2 Array{Float64,2}:
1.2821 -2.10146
-1.00158 1.8163
2x2 Array{Float64,2}:
1.2821 -2.10146
-1.00158 1.8163
2x2 Array{Float64,2}:
1.2821 -2.10146
-1.00158 1.8163
当我实际创建它们时,为什么三个2x2矩阵相同?
我确实理解在将数组分配给Julia中的数组时必须要小心,但不知何故错误使我无法理解。
我发现的有趣的事情是,如果我初始化A如下:
for dd=1:3
A[dd] = zeros(2,2)
end
而不是与
fill!(A, zeros(2,2))
像上面那样,我得到了我认为正确的结果:
3-element Array{Array{Float64,2},1}:
2x2 Array{Float64,2}:
-0.176283 0.22073
-1.71021 -0.575144
2x2 Array{Float64,2}:
1.94395 1.09946
1.65326 -0.446783
2x2 Array{Float64,2}:
1.2821 -2.10146
-1.00158 1.8163
请注意,最后一个矩阵是上面重复的矩阵。
数组初始化是错误的还是赋值? 我想这是两者的结合,取决于你是如何做到的。 提前致谢。
你几乎自己回答了。 是,
fill!(A, zeros(2,2))
是罪魁祸首,在命令之后,A的每个单元包含相同的数组(连接到内存中相同的2x2点)。 函数zeros
被调用一次。
在循环中填充数组的单元格
for dd=1:3
A[dd] = zeros(2,2)
end
将函数调用zeros
3次,为每个单元格返回一个不同的零数组(位于内存中的不同位置)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.