2014-05-23 27 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]'來訪問這些值。 –