2013-12-05 2 views
23

Я пытаюсь создать массив из двух массивов. Однако a = [[1, 2], [3, 4]] этого не делает, он фактически конкатцирует массивы. Это справедливо в Джулии: [[1, 2], [3, 4]] == [1, 2, 3, 4]. Есть идеи?Инициализировать массив массивов в Julia

Как временное решение, я использую push!(push!(Array{Int, 1}[], a), b).

ответ

17

Если вы хотите массив массивов, в отличие от матрицы (то есть 2-мерный Array):

a = Array[ [1,2], [3,4] ] 

Вы можете параметризовать (указать тип элементов) Array буквально, поставив тип перед []. Итак, здесь мы параметризуем литерал Array с типом Array. Это изменяет интерпретацию скобок внутри литерального объявления.

2

Вы, вероятно, хотите матрицу:

julia> a = [1 2; 3 4] 
2x2 Int64 Array: 
1 2 
3 4 

Может быть кортеж:

julia> a = ([1,2],[3,4,5]) 
([1,2],[3,4,5]) 
2

Вы также можете сделать {[1,2], [3,4]}, который создает Array{Any,1} содержащий [1,2] и [3,4] вместо с Array{Array{T,N},1}.

+0

Я думал, что '' {} была для карт - но я пробовал это и вижу, что это действительно так, как вы говорите. Здесь гораздо больше, чем я понимаю! – Benjohn

+0

'{...}' устарел в Julia v0.4. –

+0

@ DavidP.Sanders, что было заменено этим синтаксисом? – PythonNut

13

Ответ Шона Маккези даст вам что-то типа Array{Array{T,N},1} (или Array{Array{Int64,N},1}, если вы положили тип перед []). Если вместо этого вы хотите что-то более сильно типизированных, к примеру, вектор векторов из Int (т.е. Array{Array{Int64,1},1}), используйте следующую команду:

a = Vector{Int}[ [1,2], [3,4] ] 
6

Для общего ответа на построения Массивы типа Array:

В Julia вы можете иметь массив, содержащий другие объекты типа Array. Рассмотрим следующие примеры инициализации различных типов массивов:

A = Array{Float64}(10,10) # A single Array, dimensions 10 by 10, of Float64 type objects 

B = Array{Array}(10,10,10) # A 10 by 10 by 10 Array. Each element is an Array of unspecified type and dimension. 

C = Array{Array{Float64}}(10) ## A length 10, one-dimensional Array. Each element is an Array of Float64 type objects but unspecified dimensions 

D = Array{Array{Float64, 2}}(10) ## A length 10, one-dimensional Array. Each element of is an 2 dimensional array of Float 64 objects 

Рассмотрим, например, различия между С и D здесь:

julia> C[1] = rand(3) 
3-element Array{Float64,1}: 
0.604771 
0.985604 
0.166444 

julia> D[1] = rand(3) 
ERROR: MethodError: 

rand(3) производит объект типа Array{Float64,1}. Поскольку единственной спецификацией для элементов C является то, что они являются массивами с элементами типа Float64, это соответствует определению C. Но для D мы указали, что элементы должны быть двухмерными массивами. Таким образом, поскольку rand(3) не производит 2 одномерный массив, мы не можем использовать его, чтобы присвоить значение определенного элемента D

Указать конкретные размеры массивов в пределах массива

Хотя мы можем указать, что Массив будет содержать элементы, которые имеют тип Array, и мы можем указать, например, эти элементы должны быть двумерными массивами, мы не можем напрямую определять размеры этих элементов. Например. мы не можем напрямую указать, что мы хотим, чтобы Array держал 10 массивов, каждый из которых составлял 5,5.Мы можем увидеть это из синтаксиса для функции Array() используется для построения массива:

массива {T} (тускнеет)

конструирует неинициализированный плотный массив с типом элемента Т. тускнеет может быть кортеж или ряд целых аргументов. Синтаксис Array (T, dims) также доступен, но устарел.

Тип массива в Юлии включает в себя количество измерений, но не размер этих размеров. Таким образом, в этом синтаксисе нет места для указания точных измерений. Тем не менее, подобный эффект может быть достигнут с использованием массива понимания:

E = [Array{Float64}(5,5) for idx in 1:10] 
8

В Джулии v0.5, оригинальный синтаксис Теперь производит желаемый результат:

julia> a = [[1, 2], [3, 4]] 
2-element Array{Array{Int64,1},1}: 
[1,2] 
[3,4] 

julia> VERSION 
v"0.5.0" 
Смежные вопросы