Подтвердить что ты не робот

Инициализировать массив массивов в Julia

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

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

4b9b3361

Ответ 1

Если вам нужен массив массивов, а не матрица (т.е. 2-мерная Array):

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

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

Ответ 2

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

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

Ответ 3

В Julia 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"

Ответ 4

Для общего ответа на построение массивов типа 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

Рассмотрим, например, различия между C и 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 мы указали, что элементы должны быть 2-мерными Массивами. Таким образом, поскольку rand(3) не создает двумерный массив, мы не можем использовать его для назначения значения определенному элементу D

Укажите конкретные размеры массивов в массиве

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

Массив {T} (dims)

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

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

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

Ответ 5

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

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])

Ответ 6

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

Ответ 7

Для тех, кто интересуется, в v0.7 это довольно похоже:

Array{Array{Float64,1},2}(undef, 10,10)  #creates a two-dimensional array, ten rows and ten columns where each element is an array of type Float64

Array{Array{Float64, 2},1}(undef,10) #creates a one-dimensional array of length ten, where each element is a two-dimensional array of type Float64