julia lang - programacion - Inicializar una matriz de matrices en Julia
julia lenguaje de programacion (6)
En Julia v0.5, la sintaxis original ahora produce el resultado deseado:
julia> a = [[1, 2], [3, 4]]
2-element Array{Array{Int64,1},1}:
[1,2]
[3,4]
julia> VERSION
v"0.5.0"
Estoy tratando de crear una matriz de dos matrices. Sin embargo, a = [[1, 2], [3, 4]]
no hace eso, en realidad concatena las matrices. Esto es cierto en Julia: [[1, 2], [3, 4]] == [1, 2, 3, 4]
. ¿Alguna idea?
Como solución temporal, uso push!(push!(Array{Int, 1}[], a), b)
.
La respuesta de Sean Mackesey le dará algo de tipo Array{Array{T,N},1}
(o Array{Array{Int64,N},1}
, si coloca el tipo delante de []
). Si, en cambio, desea que se escriba algo más, por ejemplo, un vector de vectores de Int (es decir, Array{Array{Int64,1},1}
), use lo siguiente:
a = Vector{Int}[ [1,2], [3,4] ]
Para una respuesta general sobre la construcción de matrices de tipo Array
:
En Julia, puede tener una matriz que contiene otros objetos de tipo matriz. Considere los siguientes ejemplos de inicialización de varios tipos de Arrays:
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
Considere, por ejemplo, las diferencias entre C y D aquí:
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)
produce un objeto de tipo Array{Float64,1}
. Dado que la única especificación para los elementos de C
es que son matrices con elementos de tipo Float64, esto se ajusta a la definición de C
Pero, para D
especificamos que los elementos deben ser matrices bidimensionales. Por lo tanto, dado que rand(3)
no produce una matriz bidimensional, no podemos usarla para asignar un valor a un elemento específico de D
Especificar dimensiones específicas de matrices dentro de una matriz
Aunque podemos especificar que un Array tendrá elementos que son de tipo Array, y podemos especificar que, por ejemplo, esos elementos deben ser Arrays bidimensionales, no podemos especificar directamente las dimensiones de esos elementos. Por ejemplo, no podemos especificar directamente que queremos una matriz que contenga 10 matrices, cada una de las cuales es 5,5. Podemos ver esto en la sintaxis de la función Array()
utilizada para construir un Array:
Array {T} (dims)
construye una matriz densa sin inicializar con el tipo de elemento T. dims puede ser una tupla o una serie de argumentos enteros. La sintaxis Array (T, dims) también está disponible, pero está obsoleta.
El tipo de una matriz en Julia abarca el número de las dimensiones pero no el tamaño de esas dimensiones. Por lo tanto, no hay lugar en esta sintaxis para especificar las dimensiones precisas. Sin embargo, se podría lograr un efecto similar utilizando una comprensión de Array:
E = [Array{Float64}(5,5) for idx in 1:10]
Probablemente quieras una matriz:
julia> a = [1 2; 3 4]
2x2 Int64 Array:
1 2
3 4
Tal vez una tupla
julia> a = ([1,2],[3,4,5])
([1,2],[3,4,5])
Si desea una matriz de matrices en lugar de una matriz (es decir, una matriz bidimensional):
a = Array[ [1,2], [3,4] ]
Puede parametrizar (especificar el tipo de los elementos) un literal de Array
colocando el tipo delante de []
. Así que aquí estamos parametrizando el literal Array
con el tipo Array
. Esto cambia la interpretación de los corchetes dentro de la declaración literal.
También puede hacer {[1,2], [3,4]}
que crea un Array{Any,1}
contiene [1,2]
y [3,4]
lugar de un Array{Array{T,N},1}
.