เมทริกซ์บล็อกแนวทแยงมุมจากคอลัมน์


16

สร้างแรงบันดาลใจจาก Copied จากคำถามนี้ที่ Stack Overflow

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

1 2 3
4 5 6

ผลลัพธ์จะเป็น

1 0 0
4 0 0
0 2 0
0 5 0
0 0 3
0 0 6

กฎระเบียบ

อินพุตและเอาต์พุตอาจอยู่ในรูปแบบของอาร์เรย์ 2 มิติอาร์เรย์ที่ซ้อนกันหรือสตริงที่มีตัวคั่นต่างกันสำหรับแถวและคอลัมน์

ตัวเลขในอินพุต (เมทริกซ์A) จะเป็นจำนวนเต็มบวก

อนุญาตให้ใช้รูปแบบ Unary ได้ตราบใดที่เลขศูนย์ในเอาต์พุตแสดงด้วยวิธีที่สมเหตุสมผล ตัวอย่างเช่นผลลัพธ์ข้างต้นสามารถแสดงได้โดยใช้เครื่องหมายคำพูดเพื่อใส่แต่ละหมายเลข:

'1' '' ''
'1111' '' ''
'' '11' ''
'' '11111' ''
'' '' '111'
'' '' '111111'

กรณีทดสอบ

อินพุตเอาต์พุต:

1 2 3
4 5 6

1 0 0
4 0 0
0 2 0
0 5 0
0 0 3
0 0 6


10 20

10  0
 0 20    


10
20

10
20


  1   2   3
 10  20  30
100 200 300

  1   0   0
 10   0   0
100   0   0
  0   2   0
  0  20   0
  0 200   0
  0   0   3
  0   0  30
  0   0 300

 2  4
 6  8
10 12

 2  0
 6  0
10  0
 0  4
 0  8
 0 12

ตัวเลขทั้งหมดใน A จะแตกต่างกันหรือไม่
Adám

@ Nᴮᶻไม่สามารถเทียบได้
Luis Mendo

คำตอบ:


7

MATL , 6 ไบต์

"@N$Yd

ทำงานในเวอร์ชันปัจจุบัน (13.0.0)ของภาษา / คอมไพเลอร์

อินพุตมีรูปแบบต่อไปนี้โดยใช้เครื่องหมายอัฒภาคเป็นตัวคั่นแถวและเครื่องหมายจุลภาคหรือช่องว่างเป็นตัวคั่นคอลัมน์ภายในแต่ละแถว:

[1, 2, 3; 4, 5, 6]

ลองออนไลน์!

คำอธิบาย

"         % implicitly input 2D array and loop over its columns
  @       %   push column
  N$Yd    %   build block-diagonal matrix from all stack contents. Stack contents are
          %   a single column in the first iteration, or a partially built 2D array
          %   and a new column in all other iterations
          % end loop
          % implicit display

ทำงานตัวอย่าง

[1 2 3; 4 5 6]พิจารณาการป้อนข้อมูล สำหรับห่วงเริ่มต้นด้วยการ"ใช้แต่ละคอลัมน์ของอินพุต ภายในแต่ละการวนซ้ำ@ผลักคอลัมน์ปัจจุบันลงบนสแต็ก [1; 4]ดังนั้นในการย้ำแรกมันดัน ระบุว่าเนื้อหาของสแต็คจะถูกนำมาใช้เป็นปัจจัยการผลิตของฟังก์ชั่นดังต่อไปนี้N$Yd

ฟังก์ชั่นนี้ (สอดคล้องกับ MATLAB's blkdiag) "เชื่อมต่อแนวทแยงมุม" อินพุทของมันเพื่อสร้างเมทริกซ์บล็อกทแยงมุม (อาร์เรย์ 2 มิติ) ดังนั้นในการวนซ้ำครั้งแรกYdจะรับหนึ่งอินพุตและสร้างเอาต์พุตเท่ากับอินพุต[1; 4]นั้นซึ่งเหลืออยู่บนสแต็ก

ในการทำซ้ำครั้งที่สองคอลัมน์ที่สองของอินพุต[2; 5]จะถูกผลัก ตอนนี้Ydจะใช้เวลาสอง 2 × 1 ปัจจัยการผลิตคือ[1; 4]และ[2; 5]และผลิต 4 × 2 [1 0; 4 0; 0 2; 0 5]อาร์เรย์

ในการทำซ้ำที่สามYdจะใช้เวลาหลัง 4 × 2 อาร์เรย์และคอลัมน์ที่สามของการป้อนข้อมูลและก่อให้เกิดผลสุดท้าย[3; 6][1 0 0; 4 0 0; 0 2 0; 0 5 0; 0 0 3; 0 0 6]


3

ES6, 65 ไบต์

a=>[].concat(...a[0].map((_,i)=>a.map(b=>b.map((c,j)=>i-j?0:c))))

ใช้เป็นอินพุตและส่งคืนเป็นอาร์เรย์ของอาร์เรย์


1
@WashingtonGuedes แผนที่ด้านในจะคืนค่าสำเนาของอาร์เรย์ 2D ดั้งเดิมโดยมีทั้งหมดยกเว้นคอลัมน์เดียวที่เป็นศูนย์ สำเนาเหล่านี้จะต้องต่อกันแทนที่จะเป็นองค์ประกอบของอาร์เรย์ 3 มิติด้านนอก
Neil

3

Mathematica, 40 39 ไบต์

เครดิต @Seeq สำหรับไอเอ็นจีInfixFlatten

Transpose[DiagonalMatrix/@#]~Flatten~1&

อินพุตคือรายการของเวกเตอร์แถวที่คั่นด้วย{}วงเล็บ ดังนั้นตัวอย่างเริ่มต้นจะถูกแทนด้วย

{{1,2,3},{4,5,6}}

สร้างอาร์เรย์DiagonalMatrixที่แต่ละองค์ประกอบมีองค์ประกอบที่เป็นเส้นทแยงมุมจากแถวของอินพุต (อาร์เรย์ 3 มิติ) Transposeดังนั้นการFlattenดำเนินการลบคู่วงเล็บเหลี่ยมที่ถูกต้องเพื่อให้เมทริกซ์ที่ต้องการ (ตอนนี้อาร์เรย์ 2 มิติ)


1
จะไม่DiagonalMatrix/@#ทำงานเหรอ และโดยการขยายTranspose[DiagonalMatrix/@#]~Flatten~1&
seequ

เยี่ยมมากฉันตั้งใจจะซ่อมมันหลังจากม้วนมันขึ้นมา ไม่คิดว่าจะใช้Infix Flattenแม้ว่า +1
IPoiler


1

เยลลี่ 13 ไบต์

ZLR’×L0ẋ;"Zz0

ลองออนไลน์!

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

ZLR’×L0ẋ;"Zz0  Main link. Input: M (matrix)

Z              Transpose M.
 L             Get the length of the result. This yields the number of M's columns.
  R            Range; for m columns, yield [1, ..., m].
   ’           Decrement to yield [0, ..., m-1].
    ×L         Multiply each by the length (number of rows) of M.
               This yields [0, n, ..., n(m-1)], where n is the number of rows.
      0ẋ       Push a list of lists of zeroes.
               First element is [], last is n(m-1) zeroes.
        ;"Z    Prepend the kth vector of zeroes to the kth column of M.
           z0  Zip, filling the non-rectangular 2D array with zeroes.

1

Mathematica, 111 ไบต์

Join@@@ReplacePart[Table[0,#2/#3]~Table~#3~Table~#3,Table[{n,n}->#[[n]],{n,#3}]]&[Length@#,Length@Flatten@#,#]&

ไวยากรณ์อินพุตคืออะไร นี้พ่นTableและPartข้อผิดพลาดเมื่อใช้สัญกรณ์เมทริกซ์วีคมาตรฐานและผลในอาร์เรย์มิติผสม
IPoiler

1

Ruby, 81 78 76 62 ไบต์

->a{i=-1;a[0].flat_map{i+=1;a.map{|b|x=b.map{0};x[i]=b[i];x}}}

ถอนหายใจwith_indexด้วยตนเองติดตามความเคลื่อนไหวของดัชนีจะสั้นกว่า

->a{
i=-1;            # index of the flat_map
a[0]             # duplicate all rows as many times as necessary
.flat_map{       # we're wrapping each "group" of original rows with yet another
                 #  array, so we need to flat_map to get rid of those
i+=1;            # increment the index of the current subarray
a.map{|b|        # for each sub-subarray (these are the rows)...
x=b.map{0};      # zero everything out
x[i]=b[i];       # replace the desired elements
x}}}             # finally, return the modified array

1

R, 41 ไบต์

pryr::f(Matrix::.bdiag(plyr::alply(a,2)))

ถือว่าpryr, Matrixและplyrแพคเกจที่มีการติดตั้ง

สิ่งนี้จะสร้างฟังก์ชั่นที่รับอาร์เรย์ 2D (a) และส่งกลับ "sparseMatrix" โดยที่ (ซึ่ง 0 เป็นตัวแทน.)

(a=matrix(1:6,ncol=3))
#      [,1] [,2] [,3]
# [1,]    1    3    5
# [2,]    2    4    6
pryr::f(Matrix::.bdiag(plyr::alply(a,2)))(a)
# 6 x 3 sparse Matrix of class "dgTMatrix"
#          
# [1,] 1 . .
# [2,] 2 . .
# [3,] . 3 .
# [4,] . 4 .
# [5,] . . 5
# [6,] . . 6

คำอธิบาย:

plyr::alply(a,2)แต่ละคอลัมน์ของaและส่งคืนรวมผลลัพธ์เหล่านี้ในรายการ

Matrix::.bdiag(lst) สร้างเมทริกซ์ทแยงมุมบล็อกจากรายการเมทริกซ์

pryr::f เป็นวิธีจดชวเลขในการสร้างฟังก์ชั่น

Rโซลูชันพื้นฐานทั้งหมดใน 59 ไบต์ (ใช้ตรรกะของคำตอบ Matlab ของ @ PieCot):

function(a){l=dim(a);diag(l[2])%x%matrix(1,nrow=l[1])*c(a)}

1

MATLAB, 69 68 ไบต์

   function h=d(a)
   [r,c]=size(a);h=repmat(a,c,1).*kron(eye(c),~~(1:r)')

หนึ่งไบต์ถูกโกนออก: ขอบคุณ Luis Mendo :)


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