Sütunlardan blok çapraz matris


16

Esinlenerek kopyalanmış bu soruya yığın taşması de.

Bir matris verildiğinde, sütunları blok diyagonal bir şekilde düzenlenecek şekilde Abir matris oluşturun . Örneğin,BA

1 2 3
4 5 6

çıktı

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

kurallar

Giriş ve çıkış, 2B diziler, iç içe diziler veya satırlar ve sütunlar için farklı ayırıcılara sahip dizeler biçiminde olabilir.

Girişteki (matris A) sayılar pozitif tamsayılar olacaktır.

Çıktıdaki sıfırlar makul bir şekilde görüntülendiği sürece tekli biçime izin verilir. Örneğin, yukarıdaki sonuç her sayıyı içine almak için tırnak işaretleri kullanılarak görüntülenebilir:

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

Test senaryoları

Giriş çıkış:

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'daki tüm sayılar farklı mı olacak?
Adám

@ Nᴮᶻ Hayır, eşit olabilirler
Luis Mendo

Yanıtlar:


7

MATL , 6 bayt

"@N$Yd

Dilin / derleyicinin geçerli sürümünde (13.0.0) çalışır .

Giriş, satır ayırıcı olarak noktalı virgül ve her satırda virgül veya boşluk olarak noktalı virgülle aşağıdaki forma sahiptir:

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

Çevrimiçi deneyin!

açıklama

"         % 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

Çalışılan örnek

Girişi düşünün [1 2 3; 4 5 6]. For döngüsü ile başlayan "girişin her sütununu alır. Her yinelemede, @geçerli sütunu yığının üzerine iter. İlk iterasyonda iter [1; 4]. N$tüm yığın içeriğinin aşağıdaki işlevin girişleri olarak kullanılacağını belirtir Yd,.

Bu fonksiyon (MATLAB'lara karşılık gelir blkdiag) bir blok diyagonal matris (2D dizi) üretmek için girişlerini çapraz olarak birleştirir. Bu nedenle, ilk yinelemede Ydbir giriş alır [1; 4]ve yığının üzerinde bırakılan bu girişe eşit bir çıkış üretir .

İkinci yinelemede, girdinin ikinci sütunu [2; 5]itilir. Şimdi Yd, yani iki adet 2 x 1 girdileri alır [1; 4]ve [2; 5], 4 x 2 dizi üretir [1 0; 4 0; 0 2; 0 5].

Üçüncü yinelemede Yd, son 4 × 2 dizisini ve girişin üçüncü sütununu alır [3; 6]ve nihai sonucu üretir [1 0 0; 4 0 0; 0 2 0; 0 5 0; 0 0 3; 0 0 6].


3

ES6, 65 bayt

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

Giriş olarak alır ve çıkış olarak bir dizi dizisi döndürür.


1
@WashingtonGuedes İç harita orijinal 2B dizinin bir kopyası dışında bir sütun sıfırlanmış bir kopyasını döndürür. Bu kopyaların daha sonra, yalnızca bir dış 3D dizisinin öğeleri olmak yerine birleştirilmesi gerekir.
Neil

3

Mathematica, 40 39 Bayt

@Seeq'e Infixing Flatten.

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

Girdi, {}köşeli parantezlerle ayrılmış satır vektörlerinin listesidir . Yani ilk örnek

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

DiagonalMatrixHer birinin giriş satırlarından (3-B dizisi) köşegen öğelere sahip olduğu bir dizi oluşturun . Transposeböylece Flattenişlem, istenen matrisi (şimdi 2-D dizisi) vermek için doğru braket çiftlerini kaldırır.


1
Çalışmaz mıydı DiagonalMatrix/@#? Ve, uzatma ile,Transpose[DiagonalMatrix/@#]~Flatten~1&
bkz.

İyi yakaladım, yuvarladıktan sonra düzeltmeyi amaçladım. Infix FlattenGerçi kullanmayı düşünmüyordu . +1.
IPoiler


1

Jöle, 13 bayt

ZLR’×L0ẋ;"Zz0

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

Giriş sözdizimi nedir? Bu , standart MMA matris notasyonu kullanıldığında atar Tableve Parthata yapar ve bir dizi karışık boyutla sonuçlanır.
IPoiler

1

Yakut, 81 78 76 62 bayt

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

sigh Dizinin manuel olarak kaydedilmesi daha kısadır 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 bayt

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

Devraldı pryr, Matrixve plyrpaketler yüklenir.

Bu, bir 2D dizi (a) alan ve "sparseMatrix" döndüren bir işlev oluşturur (burada (0'lar temsil edilir .)

(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

Açıklama:

plyr::alply(a,2)ave döndürülen her sütun bu sonuçları bir listede birleştirir

Matrix::.bdiag(lst) bir matrisler listesinden blok çapraz matris oluşturur

pryr::f bir işlev oluşturmanın kısa yoludur.

R59 baytlık tam tabanlı bir çözüm (@ PieCot'un Matlab cevabının mantığını kullanarak):

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

1

MATLAB, 69 68 bayt

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

Bir bayt traş edildi: Luis Mendo sayesinde :)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.