Tính toán sản phẩm Kronecker


11

Liên quan , nhưng rất khác nhau.


Trong các ví dụ dưới đây, ABsẽ là các ma trận 2 nhân 2 và các ma trận được lập chỉ mục một.

Một sản phẩm Kronecker có các thuộc tính sau:

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)

Thử thách: Đưa ra hai ma trận, AB, trở lại A⊗B.

  • Kích thước của ma trận sẽ ít nhất 1-by-1. Kích thước tối đa sẽ là bất cứ thứ gì máy tính / ngôn ngữ của bạn có thể xử lý theo mặc định, nhưng 5-by-5đầu vào tối thiểu .
  • Tất cả các giá trị đầu vào sẽ là số nguyên không âm
  • Các hàm dựng sẵn tính toán các sản phẩm Kronecker hoặc các sản phẩm Tensor / Outer không được phép
  • Nói chung: Các quy tắc chuẩn về định dạng I / O, chương trình & chức năng, sơ hở, v.v.

Các trường hợp thử nghiệm:

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

Câu trả lời:


1

Thạch, 10 9 byte

×€€;"/€;/

Sử dụng Thuật toán của Büttner ( üphát âm khi cố gắng tạo ra eeâm thanh [như gặp nhau] trong hình dạng miệng của ooâm thanh [như khi khởi động]).

Các ;"/€;/được lấy cảm hứng từ Dennis Mitchell . Nó ban đầu Z€F€€;/(có giá thêm một byte).


1
Hoặc, trong IPA, / y /
Luis Mendo

Không phải ai cũng biết IPA.
Leaky Nun

4
Cảm ơn đã giải thích về cách phát âm họ của Martin. Nó siêu liên quan. : P
Alex A.

Chà, đó là cách tôi thể hiện sự tôn trọng ...
Leaky Nun

;/có thể bây giờ (tính năng thách thức postdates?)
user202729

6

CJam, 13 byte

{ffff*::.+:~}

Đây là một khối không tên, dự kiến ​​có hai ma trận trên đỉnh của ngăn xếp và để sản phẩm Kronecker của chúng ở vị trí của chúng.

Bộ thử nghiệm.

Giải trình

Đây chỉ là phần sản phẩm của Kronecker từ câu trả lời trước , do đó tôi ở đây chỉ sao chép các phần có liên quan của phần giải thích trước:

Dưới đây là tổng quan nhanh về các toán tử infix của CJam để thao tác danh sách:

  • fmong đợi một danh sách và một cái gì đó khác trên ngăn xếp và ánh xạ toán tử nhị phân sau qua danh sách, chuyển vào phần tử khác làm đối số thứ hai. Vd [1 2 3] 2 f*2 [1 2 3] f*cả hai cho [2 4 6]. Nếu cả hai phần tử là danh sách, phần tử thứ nhất được ánh xạ và phần tử thứ hai được sử dụng để làm cho toán tử nhị phân.
  • :có hai cách sử dụng: nếu toán tử theo sau nó là unary, đây là một bản đồ đơn giản. Ví dụ như [1 0 -1 4 -3] :z[1 0 1 4 3], nơi zđược các mô đun của một số. Nếu toán tử theo sau nó là nhị phân, điều này sẽ gấp toán tử thay thế. Ví dụ như [1 2 3 4] :+10.
  • .véc tơ một toán tử nhị phân. Nó mong đợi hai danh sách làm đối số và áp dụng toán tử cho các cặp tương ứng. Vd [1 2 3] [5 7 11] .*cho [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.

3
Mã của bạn gần giống như một địa chỉ IPv6
Chấn thương kỹ thuật số

4

MATLAB / Octave, 83 42 byte

Đã lưu 41 byte, nhờ FryAmTheEggman!

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

Kiểm tra nó ở đây!

Phá vỡ

arrayfunlà một vòng lặp for được ngụy trang nhân lên n*B, cho một biến nđược xác định bởi đối số thứ hai. Điều này hoạt động vì lặp qua ma trận 2D giống như lặp qua vectơ. Tức for x = Alà giống như for x = A(:).

'un',0tương đương với dài dòng hơn 'UniformOutput', Falsevà chỉ định rằng đầu ra chứa các ô thay vì vô hướng.

cell2mat được sử dụng để chuyển đổi các ô trở lại thành ma trận số, sau đó được xuất ra.


Bạn nên làm rõ rằng arrayfuncác vòng lặp tuyến tính như bạn nói, như thể ma trận là một vector, nhưng forlàm không (nó vòng qua cột của mảng)
Luis Mendo


1

Julia, 40 39 37 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

  • Đối với ma trận AB , hãy map(a->a*B,A')tính sản phẩm Kronecker A⊗B .

    Kết quả là một vector của khối ma trận với kích thước của B .

    Chúng ta phải hoán vị A (với ') vì ma trận được lưu theo thứ tự chính của cột.

  • sum(A^0)tính tổng của tất cả các mục trong ma trận danh tính các kích thước của A. Đối với ma trận n × n A , điều này mang lại n .

  • Với đối số thứ nhất n , hvcatnối các khối ma trận n theo chiều ngang và các khối kết quả (lớn hơn) theo chiều dọc.


0

J, 10 byte

Đây là một trong những thực hiện có thể.

[:,./^:2*/

J, 13 byte

Đây là một cách thực hiện tương tự, nhưng thay vào đó sử dụng khả năng của J để xác định thứ hạng. Nó áp dụng *giữa mỗi yếu tố trên LHS với toàn bộ RHS.

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

Sử dụng

   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

0

JavaScript (ES6), 79

Thực hiện đơn giản với vòng lặp lồng nhau

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

Kiểm tra

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.