Dalam contoh di bawah ini, A
dan B
akan menjadi 2-by-2 matriks, dan matriks satu-diindeks.
Sebuah Kronecker produk memiliki sifat sebagai berikut:
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)
Sebuah Kronecker sum memiliki sifat sebagai berikut:
A⊕B = A⊗Ib + Ia⊗B
Ia
dan Ib
apakah matriks identitas dengan dimensi A
dan B
masing - masing. A
dan B
matriks persegi. Catat itu A
dan B
bisa dari berbagai ukuran.
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)
Diberi dua matriks persegi, A
dan B
, hitung jumlah Kronecker dari dua matriks tersebut.
- Ukuran matriks setidaknya akan menjadi
2-by-2
. Ukuran maksimum adalah apa pun yang dapat ditangani oleh komputer / bahasa Anda secara default, tetapi5-by-5
input minimum (output 5 MB). - Semua nilai input akan berupa bilangan bulat non-negatif
- Fungsi bawaan yang menghitung jumlah Kronecker atau produk Kronecker tidak diizinkan
- Secara umum: Aturan standar tentang format I / O, program & fungsi, celah dll.
Kasus uji:
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
sumber
sumber
CJam,
403938 byteFormat input adalah daftar yang berisi
A
danB
sebagai daftar 2D, misFormat output adalah daftar 2D gaya CJam tunggal.
Suite uji. (Dengan format output yang lebih mudah dibaca.)
Penjelasan
Kode ini adalah latihan operator majemuk (atau infiks). Ini umumnya berguna untuk manipulasi array, tetapi tantangan ini memperburuk kebutuhan mereka. Berikut ini gambaran singkatnya:
f
mengharapkan daftar dan sesuatu yang lain di stack dan memetakan operator biner berikut dari daftar, meneruskan elemen lain sebagai argumen kedua. Misalnya[1 2 3] 2 f*
dan2 [1 2 3] f*
keduanya memberi[2 4 6]
. Jika kedua elemen adalah daftar, yang pertama dipetakan dan yang kedua digunakan untuk menjelajah operator biner.:
memiliki dua kegunaan: jika operator mengikutinya unary, ini adalah peta sederhana. Misalnya[1 0 -1 4 -3] :z
adalah[1 0 1 4 3]
, di manaz
mendapatkan modulus nomor. Jika operator mengikutinya adalah biner, ini akan melipat operator sebagai gantinya. Misalnya[1 2 3 4] :+
adalah10
..
membuat vektor operator biner. Ini mengharapkan dua daftar sebagai argumen dan berlaku operator untuk pasangan yang sesuai. Misalnya[1 2 3] [5 7 11] .*
memberi[5 14 33]
.Perhatikan bahwa
:
itu sendiri selalu merupakan operator unary, sedangkanf
dan.
mereka sendiri selalu operator biner. Ini dapat disarang sewenang-wenang (asalkan mereka memiliki hak arities). Dan itulah yang akan kami lakukan ...sumber
:ffff*
mungkin operator (senyawa) terpanjang yang pernah saya gunakan di CJam ... Untuk satu byte lagi, orang bisa lebih gila lagi:9Yb2/Q~f.{\{,,_ff=}&}::ffff*:::.+::~:..+p
(dan ya, akan menambahkan penjelasan ketika saya selesai bermain golf).J -
383331 bytePemakaian
sumber
(2 2 $ 1 2 3 4) f (2 2 $ 1 1 1 1)
akan memunculkan kesalahan domain.? 4 4 $ 100
. Saya tidak yakin apakah ada cara untuk menggunakan komposisi angka duax f&g y = (g x) f (g y)
atau sesuatu yang lain di sini.Julia,
60595856 byteCobalah online!
Bagaimana itu bekerja
Untuk matriks A dan B , hitung
map(a->a*B,A')
produk Kronecker A⊗B .Hasilnya adalah vektor dari blok matriks dengan dimensi B .
Kita harus mengubah urutan A (dengan
'
) karena matriks disimpan dalam urutan kolom-utama.Karena bitwise TIDAK dengan komplemen dua memenuhi identitas ~ n = - (n +1) untuk semua bilangan bulat n , kami memiliki itu - ~ -n = - (~ (-n)) = - ((- n) + 1) = 1 - n , jadi - ~ -0 = 1 dan - ~ -1 = 0 .
Dengan cara ini fungsi anonim
i->map(a->a*B^i,A'^-~-i)
berlaku peta di atas untuk B⁰ (matriks identitas dengan B dimensi 's) dan A¹ = A ketika saya = 0 , dan untuk B¹ dan A⁰ ketika saya = 1 .sum(i->map(a->a*B^i,A'^-~-i),0:1)
menjumlahkan lebih dari {0,1} dengan fungsi anonim di atas, menghitung jumlah Kronecker A⊕B sebagai A¹⊗B⁰ + A⁰⊗B¹ .Hasilnya adalah vektor dari blok matriks dengan dimensi B .
sum(A^0)
menghitung jumlah semua entri dari matriks identitas dimensi A. Untuk n × n matriks A , ini menghasilkan n .Akhirnya,
hvcat(sum(A^0),sum(i->map(a->a*B^i,A'^-~-i),0:1)...)
menyatukan blok matriks yang membentuk A⊕B .Dengan argumen pertama n ,
hvcat
menyatukan n blok matriks secara horizontal, dan blok yang dihasilkan (lebih besar) secara vertikal.sumber
Ruby, 102
Dalam program uji
Membutuhkan dua array 2D sebagai input dan mengembalikan array 2D.
Mungkin ada cara yang lebih baik untuk melakukan ini: menggunakan fungsi untuk menghindari pengulangan; menggunakan satu loop dan mencetak output. Akan melihat mereka nanti.
sumber
JavaScript (ES6), 109
Dibangun di atas jawaban untuk tantangan lain
Uji
sumber