Блок-діагональна матриця зі стовпців


16

Натхненний скопійованим з цього питання в 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

Правила

Введення та вихід можуть бути у вигляді двовимірних масивів, вкладених масивів або рядків з різними роздільниками для рядків та стовпців.

Числа у введенні (матриці A) будуть натуральними цілими числами.

Унарний формат дозволений, доки нулі у висновку відображаються певним чином. Наприклад, вищезазначений результат може бути відображений за допомогою лапок, щоб укласти кожне число:

'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

Чи всі числа в А будуть різними?
Адам

@ Nᴮᶻ Ні, вони можуть бути рівними
Луїс Мендо

Відповіді:


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]. Цикл for, що починається з, "приймає кожен стовпець вводу. У межах кожної ітерації @натискає поточний стовпець на стек. Тож у першій ітерації він штовхається [1; 4]. N$Вказує , що весь вміст стека буде використовуватися в якості входів наступної функції, Yd.

Ця функція (що відповідає MATLAB blkdiag) "діагонально об'єднує" свої входи для отримання блокової діагональної матриці (2D масив). Отже, в першій ітерації 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 масиву з нульовим стовпцем, окрім одного стовпця. Ці копії потім потрібно об'єднати, а не просто елементи зовнішнього 3D-масиву.
Ніл

3

Математика, 40 39 байт

Кредит @Seeq за Infixінж Flatten.

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

Введення - це список векторів рядків, розділених {}дужками. Тож початковий приклад представлений символом

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

Створіть масив, DiagonalMatrixде кожен має діагональні елементи з рядків введення (3-D масив). Transposeтому Flattenоперація видаляє правильні дужки пар, щоб дати бажану матрицю (тепер 2-D масив).


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

Математика, 111 байт

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

Що таке вхідний синтаксис? Це кидає Tableі Partпомилки при використанні стандартних мми матричних позначень і результатів в масиві змішаних розмірів.
IPoiler

1

Рубі, 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)')

Один байт був поголений: завдяки Луїсу Мендо :)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.