新手问题:我想动态创建一个整数2D数组M[i,j],其大小(两个维度)都是事先未知的.此外,对于每个索引i,第i行的大小可以变化.
问题1:如何声明这样的数组(我是否必须)?我曾尝试Array[],Array(Int64,1...)以及Array((Int,Int),0)在此提示等.
问题2:一旦创建,如何以智能和简洁的方式填充数组?假设我的第i行假定等于给定的1维B,我想写
A[i] = B
Run Code Online (Sandbox Code Playgroud)
要么
A[i,:] = B
Run Code Online (Sandbox Code Playgroud)
甚至
A[i,1:n] = B
Run Code Online (Sandbox Code Playgroud)
n大小在哪里B.所有这些都给了我一个BoundsError().Slice可以做到这一点,但我不能同意我的声明.
您不需要2D阵列,因为在2D阵列中,所有行的大小都相同.相反,你想要一个矢量矢量.例如:
A = Array(Vector{Int}, 5)
A[1] = rand(1:10, 3)
A[2] = rand(1:100, 22)
Run Code Online (Sandbox Code Playgroud)
如果你检查A,你会看到这样的事情:
julia> A
5-element Array{Array{Int64,1},1}:
[5,7,7]
[1,63,40,86,61,39,98,5,68,97 … 78,49,44,89,48,63,90,90,86,83]
#undef
#undef
#undef
Run Code Online (Sandbox Code Playgroud)
另一个很棒的工具是使用理解:
julia> A = Vector{Int}[ [1:m] for m = 1:5]
5-element Array{Array{Int64,1},1}:
[1]
[1,2]
[1,2,3]
[1,2,3,4]
[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
你要小心的主要是每个元素A都是对向量的引用 ; 如果你指定
A[1] = b
A[2] = b
Run Code Online (Sandbox Code Playgroud)
那么任何变化b都会影响到这两个 A[1]和A[2].如果你不想那样,请使用
A[1] = copy(b)
A[2] = copy(b)
Run Code Online (Sandbox Code Playgroud)