创建未指定(变化)大小的二维数组

1 arrays julia

新手问题:我想动态创建一个整数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可以做到这一点,但我不能同意我的声明.

tho*_*oly 5

您不需要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)

  • `Vector {T}`是`Array {T,1}`的类型:请参阅https://github.com/JuliaLang/julia/blob/master/base/array.jl#L3.因此,向量只是一维数组,仅此而已. (2认同)