คำนวณผลิตภัณฑ์ Kronecker


11

ที่เกี่ยวข้องแต่แตกต่างกันมาก


ในตัวอย่างด้านล่างAและBจะเป็นเมทริกซ์แบบ 2 ต่อ 2 และเมทริกซ์จะถูกจัดทำดัชนีแบบหนึ่ง

Kronecker ผลิตภัณฑ์มีคุณสมบัติดังต่อไปนี้:

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)

ถาม: ได้รับสองเมทริกซ์AและผลตอบแทนBA⊗B

  • 1-by-1ขนาดของการฝึกอบรมจะมีอย่างน้อย ขนาดสูงสุดจะเป็นสิ่งที่คอมพิวเตอร์ / ภาษาของคุณสามารถจัดการได้ตามค่าเริ่มต้น แต่การ5-by-5ป้อนข้อมูลขั้นต่ำ
  • ค่าอินพุตทั้งหมดจะเป็นจำนวนเต็มไม่ใช่ค่าลบ
  • ไม่อนุญาตให้ใช้ฟังก์ชันแบบ Builtin ที่คำนวณผลิตภัณฑ์ Kronecker หรือTensor / Outer
  • โดยทั่วไป: กฎมาตรฐานที่เกี่ยวข้องกับรูปแบบ I / O โปรแกรมและฟังก์ชั่นช่องโหว่ ฯลฯ

กรณีทดสอบ:

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

คำตอบ:


1

เยลลี่, 10 9 ไบต์

×€€;"/€;/

ใช้อัลกอริธึมของBüttner ( üออกเสียงเมื่อพยายามทำให้eeเสียง [ดังเหมือนที่พบ] ในรูปแบบปากooเสียง (ในการบู๊ต])

;"/€;/แรงบันดาลใจจากเดนนิสมิทเชลล์ เดิมคือZ€F€€;/(ซึ่งมีค่าใช้จ่ายอีกหนึ่งไบต์)


1
หรือใน IPA / y /
Luis Mendo

ไม่ใช่ทุกคนที่รู้ IPA
Leun Nun

4
ขอบคุณสำหรับคำอธิบายวิธีออกเสียงนามสกุลของมาร์ติน มันมีความเกี่ยวข้องมาก : P
Alex A.

ดีมันเป็นวิธีที่ผมแสดงความเคารพ ...
รั่วนูน

;/สามารถเป็นตอนนี้ (ฟีเจอร์ลงวันที่ท้าทายหรือไม่)
user202729

6

CJam, 13 ไบต์

{ffff*::.+:~}

นี่คือบล็อกที่ไม่มีชื่อที่คาดว่าจะมีเมทริกซ์สองตัวที่ด้านบนสุดของสแต็กและปล่อยผลิตภัณฑ์ Kronecker ไว้ที่เดิม

ชุดทดสอบ

คำอธิบาย

นี่เป็นเพียงส่วนของผลิตภัณฑ์ Kronecker จากคำตอบก่อนหน้าดังนั้นฉันมาที่นี่เพื่อทำซ้ำส่วนที่เกี่ยวข้องของคำอธิบายก่อนหน้านี้:

นี่คือภาพรวมโดยย่อของผู้ดำเนินการมัดของ CJam สำหรับการจัดการรายการ:

  • fคาดหวังรายการและอย่างอื่นในสแต็กและแมปตัวดำเนินการไบนารีต่อไปนี้เหนือรายการโดยส่งผ่านอิลิเมนต์อื่นเป็นอาร์กิวเมนต์ที่สอง เช่น[1 2 3] 2 f*และทั้งสองให้2 [1 2 3] f* [2 4 6]หากองค์ประกอบทั้งสองเป็นลิสต์องค์ประกอบแรกจะถูกแมปผ่านและองค์ประกอบที่สองจะใช้ในการทำหน้าที่ประกอบการไบนารี
  • :มีสองใช้: หากผู้ประกอบการต่อไปนี้มันเป็น unary นี่เป็นแผนที่ง่าย ๆ เช่น[1 0 -1 4 -3] :zคือ[1 0 1 4 3]ที่zได้รับโมดูลัสของจำนวน หากโอเปอเรเตอร์ที่ตามมาเป็นไบนารี่จะเป็นการพับโอเปอเรเตอร์แทน เช่นเป็น[1 2 3 4] :+10
  • .vectorises ตัวดำเนินการไบนารี คาดว่าจะมีสองรายการเป็นอาร์กิวเมนต์และใช้โอเปอเรเตอร์กับคู่ที่สอดคล้องกัน เช่นให้[1 2 3] [5 7 11] .*[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
รหัสของคุณดูเหมือนว่าที่อยู่ IPv6
Digital Trauma

4

MATLAB / Octave, 83 42 Bytes

บันทึกแล้ว41ไบต์ขอบคุณ FryAmTheEggman!

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

ทดสอบที่นี่!

แตกหัก

arrayfunเป็น for-loop ที่ปลอมตัวเป็นทวีคูณn*Bสำหรับตัวแปรที่nกำหนดโดยอาร์กิวเมนต์ที่สอง วิธีนี้ใช้งานได้เนื่องจากการวนซ้ำผ่านเมทริกซ์ 2D นั้นเหมือนกับการวนซ้ำผ่านเวกเตอร์ คือเป็นเช่นเดียวกับfor x = Afor x = A(:)

'un',0เทียบเท่ากับ verbose มากขึ้น'UniformOutput', Falseและระบุว่าเอาต์พุตมีเซลล์แทนสเกลาร์

cell2mat จะใช้ในการแปลงเซลล์กลับเป็นเมทริกซ์ตัวเลขซึ่งจะถูกส่งออกแล้ว


คุณควรชี้แจงว่าarrayfunลูปเป็นเส้นตรงตามที่คุณพูดเช่นถ้าเมทริกซ์เป็นเวกเตอร์ แต่forไม่ได้ (มันลูปมากกว่าคอลัมน์ของอาร์เรย์)
หลุยส์ Mendo

1

Pyth, 14 12 11 ไบต์

JEsMs*RRRRJ

การแปลคำตอบของเยลลี่ซึ่งขึ้นอยู่กับอัลกอริธึมของBüttner ( üออกเสียงเมื่อพยายามทำให้eeเสียง [ดังเหมือนที่พบ] ในรูปปากooเสียง [ในขณะบูต])

ลองออนไลน์ (กรณีทดสอบ 1)!

โบนัส: คำนวณB⊗Aในจำนวนไบต์เดียวกัน

JEsMs*LRLRJ

ลองออนไลน์ (กรณีทดสอบ 1)!


1

จูเลีย40 39 37 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

  • สำหรับการฝึกอบรมและB , คำนวณสินค้า Kronecker A⊗Bmap(a->a*B,A')

    ผลที่ได้คือเวกเตอร์ของบล็อกเมทริกซ์ที่มีขนาดของB

    เราต้องแปลงA (กับ') เนื่องจากเมทริกซ์ถูกเก็บไว้ในลำดับคอลัมน์หลัก

  • sum(A^0)คำนวณผลรวมของรายการทั้งหมดของเมทริกซ์เอกลักษณ์ของมิติข้อมูลของA สำหรับn × nเมทริกซ์อัตราผลตอบแทนนี้n

  • ครั้งแรกกับการโต้แย้งn , hvcatconcatenates nบล็อกเมทริกซ์ในแนวนอนและส่งผล (ขนาดใหญ่) บล็อกแนวตั้ง


0

J, 10 ไบต์

นี่คือการดำเนินการหนึ่งที่เป็นไปได้

[:,./^:2*/

J, 13 ไบต์

นี่คือการใช้งานที่คล้ายกัน แต่แทนที่จะใช้ความสามารถของ J เพื่อกำหนดอันดับ มันใช้*ระหว่างแต่ละองค์ประกอบใน LHS กับ RHS ทั้งหมด

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

การใช้

   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

การใช้งานที่ไม่ซับซ้อนด้วยการวนซ้ำแบบซ้อน

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

ทดสอบ

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>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.