W poniższych przykładach A
i B
nie większy niż 2-by-2 matryc oraz matryc są jednym indeksowane.
Kronecker produkt ma następujące właściwości:
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)
Suma Kronecker ma następujące właściwości:
A⊕B = A⊗Ib + Ia⊗B
Ia
i Ib
są macierzami tożsamości o wymiarach odpowiednio A
i B
. A
i B
są macierzami kwadratowymi. Pamiętaj, że A
i B
mogą mieć różne rozmiary.
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)
Biorąc pod uwagę dwie macierze kwadratowe A
i B
obliczyć sumę Kroneckera dwóch macierzy.
- Rozmiar matryc będzie co najmniej
2-by-2
. Maksymalny rozmiar będzie taki, jaki domyślnie obsługuje Twój komputer / język, ale minimalna ilość5-by-5
danych wejściowych (5 MB na wyjściu). - Wszystkie wartości wejściowe będą liczbami całkowitymi nieujemnymi
- Wbudowane funkcje obliczające sumę Kronecker lub produkty Kronecker są niedozwolone
- Ogólnie: Standardowe zasady dotyczące formatu I / O, programu i funkcji, luk itp.
Przypadki testowe:
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
źródło
źródło
CJam,
403938 bajtówFormat wejściowy to lista zawierająca
A
iB
jako listy 2D, npFormat wyjściowy to pojedyncza lista 2D w stylu CJam.
Zestaw testowy. (Z bardziej czytelnym formatem wyjściowym.)
Wyjaśnienie
Ten kod jest ćwiczeniem złożonym (lub niepoprawnym) operatorów. Są one ogólnie przydatne do manipulacji tablicami, ale wyzwanie to zaostrzyło ich potrzebę. Oto krótki przegląd:
f
oczekuje listy i czegoś innego na stosie i mapuje następujący operator binarny na liście, przekazując drugi element jako drugi argument. Np.[1 2 3] 2 f*
I2 [1 2 3] f*
oba dają[2 4 6]
. Jeśli oba elementy są listami, pierwszy jest mapowany, a drugi służy do curry operatora binarnego.:
ma dwa zastosowania: jeśli podążający za nim operator jest jednoargumentowy, jest to prosta mapa. Np.[1 0 -1 4 -3] :z
Jest[1 0 1 4 3]
, gdziez
dostaje moduł liczby. Jeśli podążający za nim operator jest binarny, spowoduje to jego spasowanie . Np .[1 2 3 4] :+
Jest10
..
wektoryzuje operator binarny. Oczekuje dwóch list jako argumentów i stosuje operator do odpowiednich par. Np .[1 2 3] [5 7 11] .*
Daje[5 14 33]
.Zauważ, że
:
sam jest zawsze operatorem jednoargumentowym,f
a.
sam jest zawsze operatorem binarnym. Można je dowolnie zagnieżdżać (pod warunkiem, że mają odpowiednie arie). I to właśnie zrobimy ...źródło
:ffff*
może być najdłuższy (związek) operator jaki kiedykolwiek używane w CJam ... Na jeden więcej jeden bajt może pójść nawet bardziej szalony jednak:9Yb2/Q~f.{\{,,_ff=}&}::ffff*:::.+::~:..+p
(i tak, doda wyjaśnienie gdy skończę grać w golfa).J -
383331 bajtówStosowanie
źródło
(2 2 $ 1 2 3 4) f (2 2 $ 1 1 1 1)
podniesie błąd domeny.? 4 4 $ 100
. Nie jestem pewien, czy istnieje sposób na wykorzystanie komponowania diadax f&g y = (g x) f (g y)
lub czegoś innego.Julia,
60595856 bajtówWypróbuj online!
Jak to działa
Dla macierzy A i B ,
map(a->a*B,A')
oblicza produktów Kronecker A⊗B .Wynikiem jest wektor bloków matrycy o wymiarach B .
Musimy transponować A (z
'
), ponieważ macierze są przechowywane w porządku głównym kolumny.Ponieważ bitowe NIE z dopełnieniem dwóch spełnia tożsamość ~ n = - (n + 1) dla wszystkich liczb całkowitych n , mamy to - ~ -n = - (~ (-n)) = - ((- n) + 1) = 1 - n , więc - ~ -0 = 1 i - ~ -1 = 0 .
W ten sposób anonimowa funkcja
i->map(a->a*B^i,A'^-~-i)
stosuje powyższą mapę do B⁰ (macierz tożsamości z wymiarami B ) i A¹ = A, gdy i = 0 , oraz do B¹ i A⁰, gdy i = 1 .sum(i->map(a->a*B^i,A'^-~-i),0:1)
sumuje ponad {0,1} z powyższą anonimową funkcją, obliczając sumę Aron Kroneckera jako A¹⊗B⁰ + A⁰⊗B¹ .Wynikiem jest wektor bloków matrycy o wymiarach B .
sum(A^0)
oblicza sumę wszystkich wpisów macierzy tożsamości wymiarów A. Dla n x n macierzy A , Daje n .Na koniec
hvcat(sum(A^0),sum(i->map(a->a*B^i,A'^-~-i),0:1)...)
konkatenuje bloki macierzy, które tworzą A⊕B .Z pierwszego argumentu n ,
hvcat
skleja n bloków matrycy w poziomie, i wynikające z bloków (większych) w pionie.źródło
Ruby, 102
W programie testowym
Wymaga dwóch tablic 2D jako danych wejściowych i zwraca tablicę 2D.
Prawdopodobnie są na to lepsze sposoby: użycie funkcji w celu uniknięcia powtórzeń; używając pojedynczej pętli i wypisując wynik. Zajmę się nimi później.
źródło
JavaScript (ES6), 109
Oparty na odpowiedzi na inne wyzwanie
Test
źródło