2014-05-23 29 views
1

新手问题:我想动态创建一个整数二维数组M[i,j],它的大小(在两个维度中)是事先未知的。而且,对于每个索引i,第i行的大小可以变化。创建未指定(变化)尺寸的二维数组

问题1:如何声明这样一个数组(我甚至必须)?我试过Array[],Array(Int64,1...)Array((Int,Int),0)this hint等。

问题2:一旦创建,如何以聪明和简洁的方式填充数组?说我的第i行被假设是等于给定的一维B,我还想写

A[i] = B 

A[i,:] = B 

甚至

A[i,1:n] = B 

其中nB的大小。所有这些给我一个BoundsError()。 Slicemight可以做到这一点,但我不能同意我的声明。

回答

5

这里不需要2D数组,因为在2D数组中所有行的大小相同。相反,你想要一个矢量矢量。例如:

A = Array(Vector{Int}, 5) 
A[1] = rand(1:10, 3) 
A[2] = rand(1:100, 22) 

如果检查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 

另一个伟大的工具被使用的理解:

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] 

主要的事情你将要小心的是A的每个元素是参考到一个向量;如果分配

A[1] = b 
A[2] = b 

那么任何变化b将影响A[1]A[2]。如果你不想这样,使用

A[1] = copy(b) 
A[2] = copy(b) 
+0

你说“你想要一个载体向量”,但它读取我喜欢你声明的向量数组。尽管如此,我仍然对茱莉亚的数组和向量之间的差异感到陌生,所以也许我错过了一些东西。 –

+2

'Vector {T}'是'Array {T,1}'的一个typealias:见https://github.com/JuliaLang/julia/blob/master/base/array.jl#L3。所以矢量只是一维数组,除此之外没有什么更多。 – tholy

+1

感谢tholy清理东西。它不仅起作用,而且我在理解茱莉亚方面正在向前迈进。欢迎使用'copy'的警告!总结一下,这里最重要的是使用vector_的_vector而不是2D的数组,其水平维度是固定的。我可以为读者添加一个,即通过键入'A [i] [j]'来访问这些值。 –