Hitung Produk Kronecker

11

Terkait , tetapi sangat berbeda.


Dalam contoh di bawah ini, Adan Bakan menjadi 2-oleh-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)

Tantangan: Diberikan dua matriks, Adan B, kembali A⊗B.

  • Ukuran matriks setidaknya akan menjadi 1-by-1. Ukuran maksimum adalah apa pun yang dapat ditangani oleh komputer / bahasa Anda secara default, tetapi 5-by-5input minimum .
  • Semua nilai input akan berupa bilangan bulat non-negatif
  • Fungsi bawaan yang menghitung produk Kronecker atau produk Tensor / Outer tidak diizinkan
  • Secara umum: Aturan standar tentang format I / O, program & fungsi, celah dll.

Kasus uji:

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
Stewie Griffin
sumber

Jawaban:

1

Jelly, 10 9 byte

×€€;"/€;/

Menggunakan Algoritma Büttner ( üdiucapkan saat mencoba membuat eesuara [seperti dalam temu] dalam bentuk mulut dari oosuara [seperti saat boot]).

Ini ;"/€;/terinspirasi oleh Dennis Mitchell . Awalnya Z€F€€;/(yang biaya satu byte lagi).

Biarawati Bocor
sumber
1
Atau, dalam IPA, / y /
Luis Mendo
Tidak semua orang tahu IPA.
Leaky Nun
4
Terima kasih atas penjelasan bagaimana cara mengucapkan nama belakang Martin. Ini sangat relevan. : P
Alex A.
Begitulah cara saya menunjukkan rasa hormat ...
Leaky Nun
;/bisa sekarang. (fitur tantangan postdate?)
user202729
6

CJam, 13 byte

{ffff*::.+:~}

Ini adalah blok tanpa nama yang mengharapkan dua matriks di atas tumpukan dan meninggalkan produk Kronecker di tempatnya.

Suite uji.

Penjelasan

Ini hanya bagian produk Kronecker dari jawaban sebelumnya , oleh karena itu saya di sini hanya mereproduksi bagian yang relevan dari penjelasan sebelumnya:

Berikut ini gambaran umum singkat operator infiks CJam untuk manipulasi daftar:

  • fmengharapkan 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*dan 2 [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] :zadalah [1 0 1 4 3], di mana zmendapatkan modulus nomor. Jika operator mengikutinya adalah biner, ini akan melipat operator sebagai gantinya. Misalnya [1 2 3 4] :+adalah 10.
  • .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].
ffff*  e# This is the important step for the Kronecker product (but
       e# not the whole story). It's an operator which takes two matrices
       e# and replaces each cell of the first matrix with the second matrix
       e# multiplied by that cell (so yeah, we'll end up with a 4D list of
       e# matrices nested inside a matrix).
       e# Now the ffff* is essentially a 4D version of the standard ff* idiom
       e# for outer products. For an explanation of ff*, see the answer to
       e# to the Kronecker sum challenge.
       e# The first ff maps over the cells of the first matrix, passing in the 
       e# second matrix as an additional argument. The second ff then maps over 
       e# the second matrix, passing in the cell from the outer map. We 
       e# multiply them with *.
       e# Just to recap, we've essentially got the Kronecker product on the
       e# stack now, but it's still a 4D list not a 2D list.
       e# The four dimensions are:
       e#   1. Columns of the outer matrix.
       e#   2. Rows of the outer matrix.
       e#   3. Columns of the submatrices.
       e#   4. Rows of the submatrices.
       e# We need to unravel that into a plain 2D matrix.
::.+   e# This joins the rows of submatrices across columns of the outer matrix.
       e# It might be easiest to read this from the right:
       e#   +    Takes two rows and concatenates them.
       e#   .+   Takes two matrices and concatenates corresponding rows.
       e#   :.+  Takes a list of matrices and folds .+ over them, thereby
       e#        concatenating the corresponding rows of all matrices.
       e#   ::.+ Maps this fold operation over the rows of the outer matrix.
       e# We're almost done now, we just need to flatten the outer-most level
       e# in order to get rid of the distinction of rows of the outer matrix.
:~     e# We do this by mapping ~ over those rows, which simply unwraps them.
Martin Ender
sumber
3
Kode Anda hampir terlihat seperti alamat IPv6
Digital Trauma
4

MATLAB / Oktaf, 83 42 Bytes

Disimpan 41 byte, terima kasih kepada FryAmTheEggman!

@(A,B)cell2mat(arrayfun(@(n)n*B,A,'un',0))

Uji di sini!

Kerusakan

arrayfunadalah for-loop yang disamarkan yang mengalikan n*B, untuk variabel yang ndidefinisikan oleh argumen kedua. Ini bekerja karena perulangan melalui matriks 2D sama dengan perulangan melalui vektor. Yaitu for x = Asama dengan for x = A(:).

'un',0setara dengan lebih banyak verbose 'UniformOutput', False, dan menentukan bahwa output mengandung sel, bukan skalar.

cell2mat digunakan untuk mengubah sel kembali ke matriks numerik, yang kemudian dikeluarkan.

Stewie Griffin
sumber
Anda harus menjelaskan bahwa arrayfunloop linear seperti yang Anda katakan, seakan matriks yang vektor, tetapi fortidak tidak (itu loop atas kolom dari array)
Luis Mendo
1

Julia, 40 39 37 byte

A%B=hvcat(sum(A^0),map(a->a*B,A')...)

Cobalah online!

Bagaimana itu bekerja

  • Untuk matriks A dan B , hitungmap(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.

  • sum(A^0)menghitung jumlah semua entri dari matriks identitas dimensi A. Untuk n × n matriks A , ini menghasilkan n .

  • Dengan argumen pertama n , hvcatmenggabungkan n blok matriks secara horizontal, dan blok yang dihasilkan (lebih besar) secara vertikal.

Dennis
sumber
0

J, 10 byte

Ini adalah salah satu implementasi yang mungkin.

[:,./^:2*/

J, 13 byte

Ini adalah implementasi yang serupa, tetapi alih-alih menggunakan kemampuan J untuk menentukan peringkat. Ini berlaku *antara setiap elemen pada LHS dengan seluruh RHS.

[:,./^:2*"0 _

Pemakaian

   f =: <either definition>
    (2 2 $ 1 2 3 4) f (2 2 $ 5 6 7 8)
 5  6 10 12
 7  8 14 16
15 18 20 24
21 24 28 32
   (2 1 $ 1 2) f (1 2 $ 1 2)
1 2
2 4
   2 f 5
10
mil
sumber
0

JavaScript (ES6), 79

Implementasi langsung dengan loop berulang

(a,b)=>a.map(a=>b.map(b=>a.map(y=>b.map(x=>r.push(y*x)),t.push(r=[]))),t=[])&&t

Uji

f=(a,b)=>a.map(a=>b.map(b=>a.map(y=>b.map(x=>r.push(y*x)),t.push(r=[]))),t=[])&&t

console.log=x=>O.textContent+=x+'\n'

function show(label, mat)
{
  console.log(label)
  console.log(mat.join`\n`)
}

;[ 
  {a:[[1,2],[3,4]],b:[[5,6],[7,8]] },
  {a:[[1],[2]],b:[[1,2]]},
  {a:[[16,2,3,13],[5,11,10,8],[9,7,6,12],[4,14,15,1]],b:[[1,1],[0,1]]},
  {a:[[2]],b:[[5]]}
].forEach(t=>{
  show('A',t.a)  
  show('B',t.b)
  show('A⊗B',f(t.a,t.b))
  show('B⊗A',f(t.b,t.a))  
  console.log('-----------------')
})
<pre id=O></pre>

edc65
sumber