Relacionado , mas muito diferente.
Nos exemplos abaixo, A
e B
serão matrizes 2 por 2, e as matrizes são indexadas um.
Um produto Kronecker possui as seguintes propriedades:
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)
Desafio: Dadas duas matrizes A
e B
, retorne A⊗B
.
- O tamanho das matrizes será pelo menos
1-by-1
. O tamanho máximo será o que o seu computador / idioma puder manipular por padrão, mas com5-by-5
entrada mínima . - Todos os valores de entrada serão números inteiros não negativos
- Funções internas que calculam produtos Kronecker ou produtos tensor / externo não são permitidas
- Em geral: Regras padrão em relação ao formato de E / S, programa e funções, brechas etc.
Casos de teste:
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
fonte
fonte
;/
pode serẎ
agora. (recurso desafio deCJam, 13 bytes
Este é um bloco sem nome que espera duas matrizes no topo da pilha e deixa seu produto Kronecker em seu lugar.
Suíte de teste.
Explicação
Esta é apenas a parte do produto Kronecker da resposta anterior , portanto, estou aqui apenas reproduzindo as partes relevantes da explicação anterior:
Aqui está uma rápida visão geral dos operadores de infix do CJam para manipulação de lista:
f
espera uma lista e mais alguma coisa na pilha e mapeia o seguinte operador binário sobre a lista, passando o outro elemento como o segundo argumento. Por exemplo,[1 2 3] 2 f*
e2 [1 2 3] f*
ambos dão[2 4 6]
. Se ambos os elementos são listas, o primeiro é mapeado e o segundo é usado para curry o operador binário.:
tem dois usos: se o operador a seguir é unário, este é um mapa simples. Por exemplo,[1 0 -1 4 -3] :z
é[1 0 1 4 3]
, ondez
fica o módulo de um número. Se o operador a seguir for binário, isso fará com que o operador seja dobrado . Por exemplo,[1 2 3 4] :+
é10
..
vetoriza um operador binário. Ele espera duas listas como argumentos e aplica o operador aos pares correspondentes. Por exemplo,[1 2 3] [5 7 11] .*
dá[5 14 33]
.fonte
MATLAB / Oitava,
8342 bytesEconomizou 41 bytes, graças a FryAmTheEggman!
Teste aqui!
Demolir
arrayfun
é um loop for disfarçado que se multiplican*B
, para uma variáveln
definida pelo segundo argumento. Isso funciona porque o loop através de uma matriz 2D é o mesmo que o loop através de um vetor. Ou seja,for x = A
é o mesmo quefor x = A(:)
.'un',0
é equivalente ao mais detalhado'UniformOutput', False
e especifica que a saída contém células em vez de escalares.cell2mat
é usado para converter as células novamente em uma matriz numérica, que é então gerada.fonte
arrayfun
laços linearmente como você diz, como se a matriz fosse um vetor, masfor
faz não (ele faz um loop sobre colunas da matriz)Pitão,
141211 bytesTradução da resposta Jelly , que é baseada no algoritmo de Büttner (
ü
pronunciado ao tentar emitir umee
som [como se encontra] na forma de boca de umoo
som [como na bota]).Experimente online (caso de teste 1)!
Bônus: calcule
B⊗A
no mesmo número de bytesExperimente online (caso de teste 1)!
fonte
Julia,
403937 bytesExperimente online!
Como funciona
Para as matrizes A e B ,
map(a->a*B,A')
calcula o produto Kronecker A⊗B .O resultado é um vector de blocos da matriz com as dimensões de B .
Temos que transpor A (com
'
), pois as matrizes são armazenadas na ordem principal da coluna.sum(A^0)
calcula a soma de todas as entradas da matriz de identidade das dimensões de A. Para uma matriz n × n A , isso gera n .Com o primeiro argumento n ,
hvcat
concatena n blocos de matriz horizontalmente e os blocos (maiores) resultantes verticalmente.fonte
J, 10 bytes
Esta é uma implementação possível.
J, 13 bytes
Essa é uma implementação semelhante, mas usa a capacidade de J para definir classificações. Aplica-se
*
entre cada elemento no LHS com todo o RHS.Uso
fonte
JavaScript (ES6), 79
Implementação direta com loop aninhado
Teste
fonte