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)
Une somme Kronecker a les propriétés suivantes:
A⊕B = A⊗Ib + Ia⊗B
Ia
et Ib
sont les matrices d'identité avec les dimensions de A
et B
respectivement. A
et B
sont des matrices carrées. Notez que A
et B
peuvent être de tailles différentes.
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)
Étant donné deux matrices carrées, A
et B
, calculer la somme de Kronecker des deux matrices.
- La taille des matrices sera au moins
2-by-2
. La taille maximale sera ce que votre ordinateur / langage peut gérer par défaut, mais une5-by-5
entrée minimale (sortie de 5 Mo). - Toutes les valeurs d'entrée seront des entiers non négatifs
- Les fonctions intégrées qui calculent la somme Kronecker ou les produits Kronecker 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 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
la source
la source
CJam,
403938 octetsLe format d'entrée est une liste contenant
A
etB
sous forme de listes 2D, par exempleLe format de sortie est une seule liste 2D de type CJam.
Suite de tests. (Avec un format de sortie plus lisible.)
Explication
Ce code est un exercice sur les opérateurs composés (ou infixés). Ceux-ci sont généralement utiles pour la manipulation de tableaux, mais ce défi a exacerbé leur besoin. Voici un bref aperçu:
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]
.Notez que
:
lui - même est toujours un opérateur unaire, tandis quef
et.
eux-mêmes sont toujours des opérateurs binaires. Ceux-ci peuvent être imbriqués arbitrairement (à condition qu'ils aient les bonnes arités). Et c'est ce que nous ferons ...la source
:ffff*
pourrait être l'opérateur le plus long (composé) que j'ai jamais utilisé dans CJam ... Pour un octet de plus, on pourrait devenir encore plus fou:9Yb2/Q~f.{\{,,_ff=}&}::ffff*:::.+::~:..+p
(et oui, ajoutera une explication lorsque j'aurai fini de jouer au golf).J -
383331 octetsUsage
la source
(2 2 $ 1 2 3 4) f (2 2 $ 1 1 1 1)
générera une erreur de domaine.? 4 4 $ 100
. Je ne sais pas s'il y a un moyen d'utiliser la composition de dyadex f&g y = (g x) f (g y)
ou autre chose ici.Julia,
60595856 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.Puisque NOT au niveau du bit avec complément à deux satisfait l'identité ~ n = - (n + 1) pour tous les entiers n , nous avons que - ~ -n = - (~ (-n)) = - ((- n) + 1) = 1 - n , donc - ~ -0 = 1 et - ~ -1 = 0 .
De cette façon, la fonction anonyme
i->map(a->a*B^i,A'^-~-i)
applique la carte ci-dessus à B⁰ (la matrice d'identité avec les dimensions de B ) et A¹ = A lorsque i = 0 , et à B¹ et A⁰ lorsque i = 1 .sum(i->map(a->a*B^i,A'^-~-i),0:1)
additionne {0,1} avec la fonction anonyme ci-dessus, calculant la somme de Kronecker A⊕B comme A¹⊗B⁰ + A⁰⊗B¹ .Le résultat est un vecteur de blocs matriciels avec des dimensions de B .
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 .Enfin,
hvcat(sum(A^0),sum(i->map(a->a*B^i,A'^-~-i),0:1)...)
concatène les blocs matriciels qui forment A⊕B .Avec le premier argument n ,
hvcat
concatène n blocs de matrice horizontalement et les blocs résultants (plus grands) verticalement.la source
Rubis, 102
En programme de test
Nécessite deux tableaux 2D en entrée et renvoie un tableau 2D.
Il existe probablement de meilleures façons de procéder: utiliser une fonction pour éviter les répétitions; en utilisant une seule boucle et en imprimant la sortie. Je les examinerai plus tard.
la source
JavaScript (ES6), 109
Construit sur la réponse à l'autre défi
Tester
la source