Inicializar una matriz de matrices en Julia


Estoy tratando de crear una matriz de dos matrices. Sin embargo, a = [[1, 2], [3, 4]] no hace eso, en realidad concata los arrays. Esto es cierto en Julia: [[1, 2], [3, 4]] == [1, 2, 3, 4]. Alguna idea?

Como solución temporal, utilizo push!(push!(Array{Int, 1}[], a), b).

 28
Author: fhucho, 2013-12-06

6 answers

Si desea una matriz de matrices en lugar de una matriz (es decir, 2-dimensional Array):

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

Puede parametrizar (especificar el tipo de los elementos) un literal Array poniendo el tipo delante del []. 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.

 21
Author: Sean Mackesey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-04 01:10:00

La respuesta de Sean Mackesey te dará algo de tipo Array{Array{T,N},1} (o Array{Array{Int64,N},1}, si pones el tipo delante de []). Si en cambio desea algo más fuertemente escrito, 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] ]
 14
Author: Jim Garrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-21 05:58:30

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"
 12
Author: David P. Sanders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-22 23:03:21

Para una respuesta general sobre la construcción de matrices de tipo Array:

En Julia, puede tener un Array que contiene otros objetos de tipo Array. Considere los siguientes ejemplos de inicialización de varios tipos de matrices:

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 sean matrices con elementos de tipo Float64, esto encaja dentro de la definición de C. Pero, para D especificamos que los elementos deben ser matrices de 2 dimensiones. Por lo tanto, dado que rand(3) no produce una matriz de 2 dimensiones, no podemos usarla para asignar un valor a un elemento específico de D

Especificar Dimensiones específicas de los Arrays dentro de un Array

Aunque podemos especificar que una matriz contendrá elementos que son de tipo Matriz, y podemos especificar que, por ejemplo, esos elementos deben ser matrices de 2 dimensiones, no podemos directamente especifique las dimensiones de esos elementos. Por ejemplo, no podemos especificar directamente que queremos una matriz que contenga 10 matrices, cada una de las cuales sea 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 no inicializada con el tipo de elemento T. dims puede ser una tupla o una serie de argumentos enteros. La matriz de sintaxis (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, un efecto similar podría lograrse usando una comprensión de matriz:

E = [Array{Float64}(5,5) for idx in 1:10]
 6
Author: Michael Ohlrogge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-05 17:13:50

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])
 2
Author: juliohm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-06 12:02:19

También puede hacer {[1,2], [3,4]} que crea un Array{Any,1} que contiene [1,2] y [3,4] en lugar de un Array{Array{T,N},1}.

 2
Author: PythonNut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-05 23:20:14