열의 블록 대각 행렬


16

Stack Overflow 의이 질문 에서 Copied에서 영감을 얻었습니다 .

행렬이 주어지면 의 열이 블록 대각선 방식으로 배열되도록 행렬 A을 만듭니다 . 예를 들어, 주어진BA

1 2 3
4 5 6

출력은

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

규칙

입력 및 출력은 2D 배열, 중첩 배열 또는 행과 열에 대한 구분 기호가 다른 문자열 형식 일 수 있습니다.

입력 (matrix A) 의 숫자는 양의 정수입니다.

출력에 0이 적당한 방식으로 표시되는 한 단항 형식이 허용됩니다. 예를 들어, 위의 결과는 각 숫자를 묶기 위해 따옴표를 사용하여 표시 할 수 있습니다.

'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ᴮᶻ 아니 @, 그들은 동일 할 수있다
루이스 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]. 로 시작하는 for 루프 "는 입력의 각 열을 사용합니다. 각 반복 내 @에서 현재 열을 스택으로 푸시합니다. 따라서 첫 번째 반복에서는 푸시 [1; 4]합니다.N$모든 스택 내용이 다음 함수의 입력으로 사용되도록 지정합니다 Yd.

이 함수 (MATLAB에 해당 blkdiag)는 입력을 "대각선으로 연결"하여 블록 대각 행렬 (2D 배열)을 생성합니다. 따라서 첫 번째 반복 Yd에서는 하나의 입력을 가져와 해당 입력과 동일한 출력을 생성합니다.이 출력 [1; 4]은 스택에 남아 있습니다.

두 번째 반복에서는 입력의 두 번째 열 ( [2; 5])이 푸시됩니다. 이제 Yd두 개의 2 × 1 입력, 즉 [1; 4]and를 취하여 [2; 5]4 × 2 배열을 생성합니다 [1 0; 4 0; 0 2; 0 5].

세 번째 반복 Yd에서는 후자의 4x2 배열과 입력의 세 번째 열을 사용 [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 내부 맵은 하나의 열을 제외한 모든 열이 0 인 원래 2D 배열의 복사본을 반환합니다. 그런 다음 이러한 복사본은 외부 3D 배열의 요소가 아니라 연결해야합니다.
Neil

3

매스 매 티카, 40 39 바이트

Infixing에 대한 @Seeq의 크레디트 Flatten.

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

수학, 111 바이트

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

입력 구문은 무엇입니까? 이 발생 TablePart혼합 차원 배열 표준 MMA 행렬 표기법 결과를 사용할 경우 오류.
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}}}

sigh 인덱스를 수동으로 추적하는 것이보다 짧습니다 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@PieCot의 Matlab 답변의 논리를 사용하여 59 바이트 의 완전 기본 솔루션 :

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)')

1 바이트가 면도되었습니다 : Luis Mendo 덕분에 :)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.