কলামগুলি থেকে ব্লক-ডায়াগোনাল ম্যাট্রিক্স


16

স্ট্যাক ওভারফ্লো এ এই প্রশ্নটি থেকে অনুলিপি দ্বারা অনুপ্রাণিত

একটি ম্যাট্রিক্স দেওয়া হয়েছে, একটি ম্যাট্রিক্স 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

বিধি

ইনপুট এবং আউটপুট 2D অ্যারে, নেস্টেড অ্যারে বা সারি এবং কলামগুলির জন্য পৃথক পৃথক পৃথক পৃথক স্ট্রিং আকারে থাকতে পারে।

ইনপুট (ম্যাট্রিক্স 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

এ-এর সমস্ত সংখ্যা কি আলাদা হবে?
অ্যাডম

@ Nᴮᶻ না, তারা সমান হতে পারে
লুইস মেন্ডো

উত্তর:


7

এমএটিএল , 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,।

এই ফাংশন (ম্যাটল্যাবের অনুরূপ 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
@ ওয়াশিংটনগুয়েডস অভ্যন্তরীণ মানচিত্রটিতে একটি কলাম শূন্যের বাইরে রেখে সমস্ত সহ মূল 2D অ্যারের একটি অনুলিপি দেয়। এই অনুলিপিগুলি কেবল একটি বাহ্যিক 3D অ্যারের উপাদানের পরিবর্তে সংক্ষিপ্ত হওয়া দরকার।
নিল

3

গণিত, 40 39 বাইট

জন্য @Seeq ক্রেডিট Infixing Flatten

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

ইনপুটটি {}বন্ধনী দ্বারা সীমাবদ্ধ সারি ভেক্টরগুলির একটি তালিকা is সুতরাং প্রাথমিক উদাহরণ দ্বারা প্রতিনিধিত্ব করা হয়

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

DiagonalMatrixইনপুট (3-ডি অ্যারে) এর সারি থেকে প্রত্যেকের তির্যক উপাদান রয়েছে এমন একটি অ্যারে তৈরি করুন । Transposeসুতরাং Flattenঅপারেশনটি পছন্দসই ম্যাট্রিক্স (এখন 2-ডি অ্যারে) দিতে সঠিক বন্ধনী জোড়া সরিয়ে দেয়।


1
DiagonalMatrix/@#কাজ করবে না ? এবং, এক্সটেনশান দ্বারা,Transpose[DiagonalMatrix/@#]~Flatten~1&
seequ

ভাল ধরা, আমি এটি ঘূর্ণায়মান পরে এটি ঠিক করার উদ্দেশ্যে। Infix Flattenযদিও এটি ব্যবহার করার জন্য ভাবেন নি। +1 টি।
আইপিওলার


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ত্রুটিগুলি মিশ্র মাত্রাগুলির একটি অ্যারে তৈরি করে।
আইপিওলার

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

আর, 41 বাইট

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

অনুমান pryr, Matrixএবংplyr প্যাকেজ ইনস্টল করা হয়।

এটি এমন একটি ফাংশন তৈরি করে যা 2D অ্যারে নেয় (ক) এবং "স্পার্সামাত্রিক্স" দেয় যেখানে (যেখানে 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 একটি ফাংশন তৈরি করার একটি সংক্ষিপ্ত উপায়।

R59 বাইটে একটি সম্পূর্ণ বেস সমাধান (@ পাইকোটের মতলব উত্তরের যুক্তি ব্যবহার করে):

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

1

ম্যাটল্যাব, 69 68 বাইট

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

একটি বাইট মুণ্ডন করা হয়েছিল: লুইস মেন্ডোকে ধন্যবাদ :)


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.