在 julia 中分配给多维数组
Assignment to multidimensional array in julia
以下简单的一段代码returns,在我看来,一个意想不到的结果:
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 的每个单元格都包含 same 数组(连接到内存中相同的 2x2 点)。函数 zeros
被调用一次。
循环填充数组的单元格
for dd=1:3
A[dd] = zeros(2,2)
end
调用函数 zeros
3 次,为每个单元格(位于内存中的不同位置)返回一个 不同的 零数组。
以下简单的一段代码returns,在我看来,一个意想不到的结果:
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 的每个单元格都包含 same 数组(连接到内存中相同的 2x2 点)。函数 zeros
被调用一次。
循环填充数组的单元格
for dd=1:3
A[dd] = zeros(2,2)
end
调用函数 zeros
3 次,为每个单元格(位于内存中的不同位置)返回一个 不同的 零数组。