Connexes , mais très différentes.
Dans les exemples ci-dessous, A
et B
seront des matrices 2 par 2, et les matrices sont à un index.
Un produit Kronecker a les propriétés suivantes:
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)
Défi: étant donné deux matrices, A
et B
, retour A⊗B
.
- La taille des matrices sera au moins
1-by-1
. La taille maximale sera celle que votre ordinateur / langage peut gérer par défaut, mais l'5-by-5
entrée minimale . - Toutes les valeurs d'entrée seront des entiers non négatifs
- Les fonctions intégrées qui calculent les produits Kronecker ou les produits Tensor / Outer ne sont pas autorisées
- En général: règles standard concernant le format d'E / S, le programme et les fonctions, les failles, etc.
Cas de test:
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
la source
la source
;/
peut êtreẎ
maintenant. (défi de postdates?)CJam, 13 octets
Il s'agit d'un bloc sans nom qui attend deux matrices au-dessus de la pile et laisse leur produit Kronecker à leur place.
Suite de tests.
Explication
Ceci est juste la partie du produit Kronecker de la réponse précédente , donc je suis ici en train de reproduire les parties pertinentes de l'explication précédente:
Voici un aperçu rapide des opérateurs d'infixe de CJam pour la manipulation de liste:
f
attend une liste et quelque chose d'autre sur la pile et mappe l' opérateur binaire suivant sur la liste, en passant l'autre élément comme deuxième argument. Par exemple,[1 2 3] 2 f*
et les2 [1 2 3] f*
deux donnent[2 4 6]
. Si les deux éléments sont des listes, le premier est mappé et le second est utilisé pour curry l'opérateur binaire.:
a deux utilisations: si l'opérateur qui le suit est unaire, il s'agit d'une simple carte. Par exemple ,[1 0 -1 4 -3] :z
est[1 0 1 4 3]
, oùz
obtient le module d'un nombre. Si l'opérateur qui le suit est binaire, cela repliera l'opérateur à la place. Par exemple ,[1 2 3 4] :+
est10
..
vectorise un opérateur binaire. Il attend deux listes comme arguments et applique l'opérateur aux paires correspondantes. Par exemple,[1 2 3] [5 7 11] .*
donne[5 14 33]
.la source
MATLAB / Octave,
8342 octetsEnregistré 41 octets, grâce à FryAmTheEggman!
Testez-le ici!
Panne
arrayfun
est une boucle for déguisée qui se multiplien*B
, pour une variablen
définie par le deuxième argument. Cela fonctionne car le bouclage à travers une matrice 2D est le même que le bouclage à travers un vecteur. C'est à direfor x = A
la même chose quefor x = A(:)
.'un',0
est équivalent à la plus verbeuse'UniformOutput', False
et spécifie que la sortie contient des cellules au lieu de scalaires.cell2mat
est utilisé pour reconvertir les cellules en une matrice numérique, qui est ensuite sortie.la source
arrayfun
boucles sont linéaires comme vous le dites, comme si la matrice était un vecteur, maisfor
ne le fait pas (il boucle sur les colonnes du tableau)Pyth,
141211 octetsTraduction de la réponse de Jelly , qui est basée sur l'algorithme de Büttner (
ü
prononcé en essayant de faire unee
son [comme en rencontre] sous la forme d'une bouche d'unoo
son [comme en boot]).Essayez-le en ligne (cas de test 1)!
Bonus: calculer
B⊗A
dans le même nombre d'octetsEssayez-le en ligne (cas de test 1)!
la source
Julia,
403937 octetsEssayez-le en ligne!
Comment ça fonctionne
Pour les matrices A et B ,
map(a->a*B,A')
calcule le produit Kronecker A⊗B .Le résultat est un vecteur de blocs matriciels avec des dimensions de B .
Nous devons transposer A (avec
'
) puisque les matrices sont stockées dans l'ordre des colonnes principales.sum(A^0)
calcule la somme de toutes les entrées de la matrice d'identité des dimensions de A. Pour une matrice n × n A , cela donne n .Avec le premier argument n ,
hvcat
concatène n blocs de matrice horizontalement et les blocs résultants (plus grands) verticalement.la source
J, 10 octets
Il s'agit d'une implémentation possible.
J, 13 octets
Il s'agit d'une implémentation similaire, mais utilise à la place la capacité de J pour définir les rangs. Il s'applique
*
entre chaque élément du LHS avec l'ensemble du RHS.Usage
la source
JavaScript (ES6), 79
Implémentation simple avec boucle imbriquée
Tester
la source