In den nachfolgenden Beispielen sind, A
und B
wird 2-mal-2 - Matrix sein, und die Matrizen sind eint indexiert.
Ein Kronecker- Produkt hat folgende Eigenschaften:
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)
Eine Kronecker-Summe hat folgende Eigenschaften:
A⊕B = A⊗Ib + Ia⊗B
Ia
und Ib
sind die Identitäts - Matrizen mit den Abmessungen A
und B
jeweils. A
und B
sind quadratische Matrizen. Beachten Sie, dass A
und B
von unterschiedlicher Größe sein können.
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)
Berechnen Sie bei zwei quadratischen Matrizen A
und B
die Kronecker-Summe der beiden Matrizen.
- Die Größe der Matrizen wird mindestens sein
2-by-2
. Die maximale Größe ist die Größe, die Ihr Computer / Ihre Sprache standardmäßig verarbeiten kann, jedoch die minimale5-by-5
Eingabe (5 MB Ausgabe). - Alle Eingabewerte sind nicht negative Ganzzahlen
- Eingebaute Funktionen, die die Kronecker-Summe oder Kronecker-Produkte berechnen, sind nicht zulässig
- Im Allgemeinen: Standardregeln für E / A-Format, Programm und Funktionen, Lücken usw.
Testfälle:
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
quelle
quelle
CJam,
403938 BytesDas Eingabeformat ist eine Liste mit
A
undB
als 2D-Listen, zDas Ausgabeformat ist eine einzelne 2D-Liste im CJam-Stil.
Testsuite. (Mit besser lesbarem Ausgabeformat.)
Erläuterung
Dieser Code ist eine Übung für zusammengesetzte (oder Infix-) Operatoren. Diese sind im Allgemeinen für die Array-Manipulation nützlich, aber diese Herausforderung hat die Notwendigkeit für sie verschärft. Hier ist eine kurze Übersicht:
f
erwartet eine Liste und etwas anderes auf dem Stapel und ordnet den folgenden binären Operator der Liste zu, wobei das andere Element als zweites Argument übergeben wird. ZB[1 2 3] 2 f*
und2 [1 2 3] f*
beide geben[2 4 6]
. Wenn beide Elemente Listen sind, wird das erste zugeordnet und das zweite zum Curryen des Binäroperators verwendet.:
hat zwei Verwendungszwecke: Wenn der Operator, der ihm folgt, unär ist, ist dies eine einfache Karte. ZB[1 0 -1 4 -3] :z
ist[1 0 1 4 3]
, woz
bekommt der Modul einer Zahl. Wenn die Bediener es folgenden binär sind, wird dies klappt die Bediener statt. ZB[1 2 3 4] :+
ist10
..
vektorisiert einen binären Operator. Es erwartet zwei Listen als Argumente und wendet den Operator auf entsprechende Paare an. ZB[1 2 3] [5 7 11] .*
gibt[5 14 33]
.Beachten Sie, dass
:
selbst immer ein unärer Operator ist, währendf
und.
selbst immer binäre Operatoren sind. Diese können beliebig verschachtelt werden (vorausgesetzt, sie haben die richtigen Aritäten). Und das werden wir tun ...quelle
:ffff*
möglicherweise der längste (zusammengesetzte) Operator, den ich jemals in CJam verwendet habe ... Für ein weiteres Byte könnte man allerdings noch verrückter werden:9Yb2/Q~f.{\{,,_ff=}&}::ffff*:::.+::~:..+p
(und ja, ich werde eine Erklärung hinzufügen, wenn ich mit dem Golfen fertig bin).J -
383331 BytesVerwendungszweck
quelle
(2 2 $ 1 2 3 4) f (2 2 $ 1 1 1 1)
Wird beispielsweise einen Domänenfehler auslösen.? 4 4 $ 100
. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, Dyad Composex f&g y = (g x) f (g y)
oder etwas anderes hier zu verwenden.Julia,
60595856 BytesProbieren Sie es online aus!
Wie es funktioniert
Für Matrizen A und B ,
map(a->a*B,A')
berechnet das Kronecker - Produkt A⊗B .Das Ergebnis ist ein Vektor von Matrixblöcken mit den Abmessungen B .
Wir müssen A (mit
'
) transponieren, da Matrizen in Spalten-Hauptreihenfolge gespeichert sind.Da bitweise NICHT mit Zweierkomplement die Identität ~ n = - (n + 1) für alle ganzen Zahlen n erfüllt , haben wir - ~ -n = - (~ (-n)) = - ((- n) + 1) = 1 - n , also - ~ -0 = 1 und - ~ -1 = 0 .
Auf diese Weise
i->map(a->a*B^i,A'^-~-i)
wendet die anonyme Funktion die obige Abbildung auf B⁰ (die Identitätsmatrix mit den Dimensionen von B ) und A¹ = A an, wenn i = 0 ist , und auf B¹ und A⁰, wenn i = 1 .sum(i->map(a->a*B^i,A'^-~-i),0:1)
summiert mit der obigen anonymen Funktion über {0,1} und berechnet die Kronecker-Summe A⊕B als A¹⊗B⁰ + A⁰⊗B¹ .Das Ergebnis ist ein Vektor von Matrixblöcken mit den Abmessungen B .
sum(A^0)
berechnet die Summe aller Einträge der Identitätsmatrix der Dimensionen von A. Für eine n × n- Matrix A ergibt dies n .Schließlich
hvcat(sum(A^0),sum(i->map(a->a*B^i,A'^-~-i),0:1)...)
verkettet die Matrixblöcke daß Form A B .Mit dem ersten Argument n werden n Matrixblöcke horizontal und die resultierenden (größeren) Blöcke vertikal
hvcat
verkettet .quelle
Ruby, 102
Im Testprogramm
Benötigt zwei 2D-Arrays als Eingabe und gibt ein 2D-Array zurück.
Es gibt wahrscheinlich bessere Möglichkeiten, dies zu tun: Verwenden einer Funktion, um Wiederholungen zu vermeiden; Verwenden einer einzelnen Schleife und Drucken der Ausgabe. Werde sie später untersuchen.
quelle
JavaScript (ES6), 109
Aufbauend auf der Antwort auf die andere Herausforderung
Prüfung
quelle