在朱莉娅分配到多维数组

use*_*310 3 variable-assignment multidimensional-array 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
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,我的数组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 
Run Code Online (Sandbox Code Playgroud)

当我实际创建它们时,为什么三个2x2矩阵相同?

我确实理解在将数组分配给Julia中的数组时必须要小心,但不知何故错误使我无法理解.

我发现的有趣的事情是,如果我初始化A如下:

for dd=1:3
   A[dd] = zeros(2,2)
end
Run Code Online (Sandbox Code Playgroud)

而不是与

fill!(A, zeros(2,2))
Run Code Online (Sandbox Code Playgroud)

像上面那样,我得到了我认为正确的结果:

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
Run Code Online (Sandbox Code Playgroud)

请注意,最后一个矩阵是上面重复的矩阵.

数组初始化是错误的还是赋值?我想这是两者的结合,取决于你是如何做到的.提前致谢.

msc*_*uer 6

你几乎自己回答了.是,

fill!(A, zeros(2,2))
Run Code Online (Sandbox Code Playgroud)

是罪魁祸首,在命令之后,A的每个单元包含相同的数组(连接到内存中相同的2x2点).该函数zeros被调用一次.

在循环中填充数组的单元格

for dd=1:3
   A[dd] = zeros(2,2)
end
Run Code Online (Sandbox Code Playgroud)

调用该函数zeros3次,为每个单元格返回一个不同的零数组(位于内存中的不同位置).