Relacionado , pero muy diferente.
En los siguientes ejemplos, 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)
Reto: Dadas dos matrices, A
y B
, regreso A⊗B
.
- El tamaño de las matrices será al menos
1-by-1
. El tamaño máximo será lo que su computadora / idioma pueda manejar por defecto, pero la5-by-5
entrada mínima . - Todos los valores de entrada serán enteros no negativos
- Las funciones integradas que calculan productos Kronecker o productos Tensor / Externo no están permitidas
- 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 6
7 8
A⊗B =
5 6 10 12
7 8 14 16
15 18 20 24
21 24 28 32
B⊗A =
5 10 6 12
15 20 18 24
7 14 8 16
21 28 24 32
------------------------
A =
1
2
B =
1 2
A⊗B =
1 2
2 4
------------------------
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
B =
1 1
0 1
A⊗B =
16 16 2 2 3 3 13 13
0 16 0 2 0 3 0 13
5 5 11 11 10 10 8 8
0 5 0 11 0 10 0 8
9 9 7 7 6 6 12 12
0 9 0 7 0 6 0 12
4 4 14 14 15 15 1 1
0 4 0 14 0 15 0 1
B⊗A =
16 2 3 13 16 2 3 13
5 11 10 8 5 11 10 8
9 7 6 12 9 7 6 12
4 14 15 1 4 14 15 1
0 0 0 0 16 2 3 13
0 0 0 0 5 11 10 8
0 0 0 0 9 7 6 12
0 0 0 0 4 14 15 1
------------------------
A = 2
B = 5
A⊗B = 10
code-golf
math
linear-algebra
matrix
Stewie Griffin
fuente
fuente
;/
puede serẎ
ahora (¿desafío de fecha posterior a la función?)CJam, 13 bytes
Este es un bloque sin nombre que espera dos matrices en la parte superior de la pila y deja su producto Kronecker en su lugar.
Banco de pruebas.
Explicación
Esta es solo la parte del producto Kronecker de la respuesta anterior , por lo tanto, estoy aquí reproduciendo las partes relevantes de la explicación anterior:
Aquí hay una descripción general rápida de los operadores infijos de CJam para la manipulación de listas:
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]
.fuente
MATLAB / Octave,
8342 BytesGuardadas 41 bytes, gracias a FryAmTheEggman!
¡Pruébalo aquí!
Descompostura
arrayfun
es un bucle for disfrazado que se multiplican*B
, para una variablen
definida por el segundo argumento. Esto funciona porque recorrer una matriz 2D es lo mismo que recorrer un vector. Es decir,for x = A
es lo mismo quefor x = A(:)
.'un',0
es equivalente al más detallado'UniformOutput', False
y especifica que la salida contiene celdas en lugar de escalares.cell2mat
se utiliza para convertir las celdas de nuevo en una matriz numérica, que luego se genera.fuente
arrayfun
bucles de forma lineal como usted dice, como si la matriz eran un vector, perofor
lo hace no (se realiza un bucle sobre las columnas de la matriz)Pyth,
141211 bytesTraducción de la respuesta Jelly , que se basa en el Algoritmo de Büttner (
ü
pronunciado cuando se intenta hacer unee
sonido [como en el encuentro] en la forma de la boca de unoo
sonido [como en el arranque]).¡Pruébelo en línea (caso de prueba 1)!
Bono: calcular
B⊗A
en el mismo número de bytes¡Pruébelo en línea (caso de prueba 1)!
fuente
Julia,
403937 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.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 .Con el primer argumento n ,
hvcat
concatena n bloques de matriz horizontalmente y los bloques resultantes (más grandes) verticalmente.fuente
J, 10 bytes
Esta es una posible implementación.
J, 13 bytes
Esta es una implementación similar, pero en su lugar utiliza la capacidad de J para definir rangos. Se aplica
*
entre cada elemento en el LHS con todo el RHS.Uso
fuente
JavaScript (ES6), 79
Implementación sencilla con bucle anidado
Prueba
fuente