En los ejemplos a continuación, A
y B
serán matrices de 2 por 2, y las matrices están indexadas en uno.
Un producto Kronecker tiene las siguientes propiedades:
A⊗B = A(1,1)*B A(1,2)*B
A(2,1)*B A(2,2)*B
= A(1,1)*B(1,1) A(1,1)*B(1,2) A(1,2)*B(1,1) A(1,2)*B(1,2)
A(1,1)*B(2,1) A(1,1)*B(2,2) A(1,2)*B(2,1) A(1,2)*B(2,2)
A(2,1)*B(1,1) A(2,1)*B(1,2) A(2,2)*B(1,1) A(2,2)*B(1,2)
A(2,2)*B(2,1) A(2,2)*B(1,2) A(2,2)*B(2,1) A(2,2)*B(2,2)
Una suma de Kronecker tiene las siguientes propiedades:
A⊕B = A⊗Ib + Ia⊗B
Ia
y Ib
son las matrices de identidad con las dimensiones de A
y B
respectivamente. A
y B
son matrices cuadradas. Tenga en cuenta que A
y B
puede ser de diferentes tamaños.
A⊕B = A(1,1)+B(1,1) B(1,2) A(1,2) 0
B(2,1) A(1,1)+B(2,2) 0 A(1,2)
A(2,1) 0 A(2,2)+B(1,1) B(1,2)
0 A(2,1) B(2,1) A(2,2)+B(2,2)
Dadas dos matrices cuadradas A
y B
calcula la suma de Kronecker de las dos matrices.
- El tamaño de las matrices será al menos
2-by-2
. El tamaño máximo será lo que su computadora / idioma pueda manejar por defecto, pero la5-by-5
entrada mínima (salida de 5 MB). - Todos los valores de entrada serán enteros no negativos
- Las funciones integradas que calculan la suma de Kronecker o los productos Kronecker no están permitidos
- En general: Reglas estándar sobre formato de E / S, programa y funciones, lagunas, etc.
Casos de prueba:
A =
1 2
3 4
B =
5 10
7 9
A⊕B =
6 10 2 0
7 10 0 2
3 0 9 10
0 3 7 13
----
A =
28 83 96
5 70 4
10 32 44
B =
39 19 65
77 49 71
80 45 76
A⊕B =
67 19 65 83 0 0 96 0 0
77 77 71 0 83 0 0 96 0
80 45 104 0 0 83 0 0 96
5 0 0 109 19 65 4 0 0
0 5 0 77 119 71 0 4 0
0 0 5 80 45 146 0 0 4
10 0 0 32 0 0 83 19 65
0 10 0 0 32 0 77 93 71
0 0 10 0 0 32 80 45 120
----
A =
76 57 54
76 8 78
39 6 94
B =
59 92
55 29
A⊕B =
135 92 57 0 54 0
55 105 0 57 0 54
76 0 67 92 78 0
0 76 55 37 0 78
39 0 6 0 153 92
0 39 0 6 55 123
code-golf
arithmetic
linear-algebra
matrix
Stewie Griffin
fuente
fuente
CJam,
403938 bytesEl formato de entrada es una lista que contiene
A
yB
como listas 2D, p. Ej.El formato de salida es una única lista 2D de estilo CJam.
Banco de pruebas. (Con un formato de salida más legible).
Explicación
Este código es un ejercicio en operadores compuestos (o infijos). Estos son generalmente útiles para la manipulación de matrices, pero este desafío exacerbó la necesidad de ellos. Aquí hay un resumen rápido:
f
espera una lista y algo más en la pila y asigna el siguiente operador binario sobre la lista, pasando el otro elemento como segundo argumento. Por ejemplo,[1 2 3] 2 f*
y2 [1 2 3] f*
ambos dan[2 4 6]
. Si ambos elementos son listas, el primero se asigna y el segundo se usa para cursar el operador binario.:
tiene dos usos: si el operador que lo sigue es unario, este es un mapa simple. Por ejemplo,[1 0 -1 4 -3] :z
es[1 0 1 4 3]
, dondez
obtiene el módulo de un número. Si el operador que lo sigue es binario, esto doblará al operador en su lugar. Por ejemplo,[1 2 3 4] :+
es10
..
vectoriza un operador binario. Espera dos listas como argumentos y aplica el operador a los pares correspondientes. Por ejemplo,[1 2 3] [5 7 11] .*
da[5 14 33]
.Tenga en cuenta que
:
en sí siempre es un operador unitario, mientras quef
y.
ellos mismos son siempre los operadores binarios. Estos pueden anidarse arbitrariamente (siempre que tengan las aridades correctas). Y eso es lo que haremos ...fuente
:ffff*
podría ser el operador (compuesto) más largo que he usado en CJam ... Sin embargo, un byte más podría volverse aún más loco:9Yb2/Q~f.{\{,,_ff=}&}::ffff*:::.+::~:..+p
(y sí, agregaré una explicación cuando termine de jugar al golf).J -
383331 bytesUso
fuente
(2 2 $ 1 2 3 4) f (2 2 $ 1 1 1 1)
generará un error de dominio.? 4 4 $ 100
. No estoy seguro de si hay una manera de utilizar la composición de díadax f&g y = (g x) f (g y)
o algo más aquí.Julia,
60595856 bytesPruébalo en línea!
Cómo funciona
Para las matrices A y B ,
map(a->a*B,A')
calcula el producto Kronecker A⊗B .El resultado es un vector de los bloques de la matriz con las dimensiones de B .
Tenemos que transponer A (con
'
) ya que las matrices se almacenan en orden de columna mayor.Como NO a nivel de bits con el complemento a dos satisface la identidad ~ n = - (n + 1) para todos los enteros n , tenemos que - ~ -n = - (~ (-n)) = - ((- n) + 1) = 1 - n , entonces - ~ -0 = 1 y - ~ -1 = 0 .
De esta manera la función anónima
i->map(a->a*B^i,A'^-~-i)
se aplica el mapa de arriba a B⁰ (la matriz de identidad con B dimensiones 's) y A $ ¹ $ = A cuando i = 0 , y para B $ ¹ $ y A⁰ cuando i = 1 .sum(i->map(a->a*B^i,A'^-~-i),0:1)
suma más de {0,1} con la función anónima anterior, calculando la suma de Kronecker A⊕B como A¹⊗B⁰ + A⁰⊗B¹ .El resultado es un vector de los bloques de la matriz con las dimensiones de B .
sum(A^0)
calcula la suma de todas las entradas de la matriz de identidad de las dimensiones de A. Para una matriz n × n A , esto produce n .Finalmente,
hvcat(sum(A^0),sum(i->map(a->a*B^i,A'^-~-i),0:1)...)
concatena los bloques de la matriz que forman A⊕B .Con el primer argumento n ,
hvcat
concatena n bloques de matriz horizontalmente y los bloques resultantes (más grandes) verticalmente.fuente
Ruby, 102
En programa de prueba
Requiere dos matrices 2D como entrada y devuelve una matriz 2D.
Probablemente hay mejores formas de hacerlo: usar una función para evitar la repetición; usando un solo bucle e imprimiendo la salida. Los miraré más tarde.
fuente
JavaScript (ES6), 109
Basado en la respuesta al otro desafío
Prueba
fuente