Matris Gücünü Bulun


9

Sorun

Yükseltilmiş bir matrisin sonucu hesaplamak için bir program ya da fonksiyonu oluşturma n inci güç. Kodunuz keyfi bir kare matris A ve negatif olmayan bir tamsayı n alır ve A n değerine sahip bir matris döndürür .

Kısıtlamalar

Matris gücünü ve matris ürününü hesaplayan yerleşik işlevlere izin verilmez.

Kod golf için standart kuralların geri kalanı geçerlidir.

açıklama

Bir kare matris verilen bir değeri, A , n = AA ⋯ A (tekrarlanan matris ürününün A kendisi ile, n kere). Eğer n pozitif, sadece söz standardı kullanılır. Zaman , n sıfır, aynı sırada olan birim matris A sonucudur.

Hedef

Bu kod golf ve en kısa kod kazanır.

Test Durumları

Burada A giriş matrisi, n giriş tamsayısı ve r çıkış matrisidir, burada r = A n .

n = 0
A = 62 72
    10 34
r =  1  0
     0  1

n = 1
A = 23 61 47
    81 11 60
    42  9  0
r = 23 61 47
    81 11 60
    42  9  0

n = 2
A =  12  28 -26  3
     -3 -10 -13  0
     25  41   3 -4
    -20 -14  -4 29
r = -650 -1052  -766 227
    -331  -517   169  43
     332   469 -1158 -53
    -878  -990   574 797

n = 4
A = -42 -19  18 -38
    -33  26 -13  31
    -43  25 -48  28
     34 -26  19 -48
r = -14606833  3168904 -6745178  4491946
      1559282  3713073 -4130758  7251116
      8097114  5970846 -5242241 12543582
     -5844034 -4491274  4274336 -9196467

n = 5
A =  7  0 -3  8 -5  6 -6
     6  7  1  2  6 -3  2
     7  8  0  0 -8  5  2
     3  0  1  2  4 -3  4
     2  4 -1 -7 -4 -1 -8
    -3  8 -9 -2  7 -4 -8
    -4 -5 -1  0  5  5 -1
r =  39557  24398 -75256 131769  50575   14153  -7324
    182127  19109   3586 115176 -23305    9493 -44754
    146840  31906 -23476 190418 -38946   65494  26468
     42010 -21876  41060 -13950 -55148   19290   -406
     44130  34244 -35944  34272  22917  -39987 -54864
      1111  40810 -92324  35831 215711 -117849 -75038
    -70219   8803 -61496   6116  45247   50166   2109

3
Matris ürünü veya matris inversiyonu için yerleşikler ne olacak?
Dennis

@Dennis de bunları yasaklamayı düşünüyordum, ama çok kısıtlayıcı hissettim .
mil

2
Yerleşik matris tersi olmayan diller için, bu bana bir bukalemun meydan okuması olarak çarpıyor, çünkü bir matrisi sıfırdan tersine çevirmek, yinelenen ürünü almaktan çok daha zor görünüyor.
xnor

2
@Xnor'a katılıyorum. Peki ya bir dilde matris dönüşümü yoksa ancak matris gücü varsa? Bunun A^-1yerine kullanılabilir inv(A)mi?
Luis Mendo

1
Is exp(k*log(M))izin? (Benzersiz olmayan dallar nedeniyle işe yaramayabilir.)
xnor

Yanıtlar:


4

Jöle , 17 16 15 bayt

Z×'³S€€
LṬ€z0Ç¡

Çevrimiçi deneyin!

Izgara çıkışlı kalıcı bağlantılar: test örneği 1 | test durumu 2 | test durumu 3 | test durumu 4 | test çantası 5

Nasıl çalışır

LṬ€z0Ç¡  Main link. Arguments: A (matrix), n (power)

L        Get the length l of A.
 Ṭ€      Turn each k in [1, ..., l] into a Boolean list [0, 0, ..., 1] of length k.
   z0    Zip; transpose the resulting 2D list, padding with 0 for rectangularity.
         This constructs the identity matrix of dimensions k×k.
     Ç¡  Execute the helper link n times.

Z×'³S€€  Helper link. Argument: B (matrix)

Z        Zip; transpose rows and columns of B.
   ³     Yield A.
 ×'      Spawned multiplication; element-wise mutiply each rows of zipped B (i.e.,
         each column of B) with each row of A.
         This is "backwards", but multiplication of powers of A is commutative.
    S€€  Compute the sum of each product of rows.

5

MATL , 20 bayt

XJZyXyi:"!J2$1!*s1$e

Çevrimiçi deneyin!

açıklama

Bu, matris çarpmasını manuel olarak yaparak, yayın ile eleman-bazlı çarpımı ve ardından vektörize toplamı kullanarak önler. Özellikle, matrisleri Mve Nher ikisi de s × s boyutlarını çarpmak için :

  1. Devrik edin M. Ortaya çıkan matrisi çağırın P.
  2. Boyutlarını permute Ngibi Nbir veren birinci boyut boyunca bir dönme eksenine sahip "açık" s x 1 x s ki, 3D dizi Q.
  3. Her öğenin Pher öğesinin Qçarpım yayını ile çarpımını çarpın . Bu demektir ki P, otomatik olarak çoğaltılır s kez üçüncü boyutu boyunca ve Qçoğaltılır s ikinci boyunca kez bunları yapmak için, her iki s x s x s , gerçek öğeye çarpma gerçekleşmeden önce.
  4. 1 × s × s dizisi elde etmek için ilk boyut boyunca toplayın.
  5. Bir s × s sonucu elde etmek için, önde gelen singleton boyutunu sıkıştırın .

Yorumlanan kod:

XJ      % take matrix A. Copy to clipboard J
ZyXy    % generate identity matrix of the same size
i:      % take exponent n. Generate range [1 2 ... n] (possibly empty)
"       % for each element in that range
  !     %   transpose matrix with product accumulated up to now (this is step 1)
  J     %   paste A
  2$1!  %   permute dimensions: rotation along first-dimension axis (step 2)
  *     %   element-wise multiplication with broadcast (step 3)
  s     %   sum along first dimension (step 4)
  1$e   %   squeeze out singleton dimension, i.e. first dimension (step 5)
        % end for. Display

Başarısız 0 ....
CalculatorFeline

@CatsAreFluffy Teşekkürler! Düzeltildi
Luis Mendo

3

APL, 32 31 karakter

{⍺=0:(⍴⍵)⍴1⍨1+≢⍵⋄+.×⍨⍣(⍺-1)⊣⍵}

Sol argüman yükseltmek için güç, sağ argüman matris. En zor (en çok yer kaplayan) bit, istenen üssün 0 olduğu durum için kimlik matrisini oluşturmaktır. Gerçek hesaplama, işlenenlerle ve işlenen olarak genelleştirilmiş iç ürünün ( .) etkili bir şekilde matris ürünü olduğu gerçeğine dayanmaktadır . Bu, güç operatörü ("tekrar") ile birlikte çözeltinin etini oluşturur.+×


1: 2016 yılı oyununda Dan & Nick'i bir bayt yenen Stefano siz misiniz ?! 2. (1+≢⍵)↑1=> 1↑⍨1+≢⍵bir bayt kaydetmek için.
Zacharý

Evet o benim.
lstefano

2

Adaçayı, 112 bayt

lambda A,n:reduce(lambda A,B:[[sum(map(mul,zip(a,b)))for b in zip(*B)]for a in A],[A]*n,identity_matrix(len(A)))

Çevrimiçi deneyin

Açıklama:

İç lambda ( lambda A,B:[[sum(map(mul,zip(a,b)))for b in zip(*B)]for a in A]), matris çarpımının basit bir uygulamasıdır. Dış lambda ( lambda A,n:reduce(...,[A]*n,identity_matrix(len(A)))) reduce, matris gücünü yinelenen matris çarpımı (yukarıda bahsedilen ev yapımı matris çarpma fonksiyonunu kullanarak ) ile hesaplamak için kullanır ve kimlik matrisi desteklenecek ilk değerdir n=0.


2

Julia, 90 86 68 bayt

f(A,n)=n<1?eye(A):[A[i,:][:]⋅f(A,n-1)[:,j]for i=m=1:size(A,1),j=m]

Bu, bir matrisi ( Array{Int,2}) ve bir tamsayıyı kabul eden ve bir matrisi döndüren özyinelemeli bir işlevdir .

Ungolfed:

function f(A, n)
    if n < 1
        # Identity matrix with the same type and dimensions as the input
        eye(A)
    else
        # Compute the dot product of the ith row of A and the jth column
        # of f called on A with n decremented
        [dot(A[i,:][:], f(A, n-1)[:,j]) for i = (m = 1:size(A,1)), j = m]
    end
end

Çevrimiçi deneyin! (site için çok yavaş olan son test durumu hariç tümünü içerir)

Dennis sayesinde 18 bayt kurtardı!


2

Python 2.7, 158145 bayt

En kötü cevap burada, ama Python benim en iyi golf. En azından matris çarpımını öğrenmek eğlenceliydi.

golfed:

def q(m,p):
 r=range(len(m))
 if p<1:return[[x==y for x in r]for y in r]
 o=q(m,p-1)
 return[[sum([m[c][y]*o[x][c]for c in r])for y in r]for x in r]

Açıklama:

#accepts 2 arguments, matrix, and power to raise to
def power(matrix,exponent):
 #get the range object beforehand
 length=range(len(matrix))
 #if we are at 0, return the identity
 if exponent<1:
  #the Boolean statement works because Python supports multiplying ints by bools
  return [[x==y for x in length] for y in length]
 #otherwise, recur
 lower=power(matrix,exponent-1)
 #and return the product
 return [[sum([matrix[c][y]*lower[x][c] for c in length]) for y in length] for x in length]

1

JavaScript (ES6), 123 bayt

(n,a)=>[...Array(n)].map(_=>r=m(i=>m(j=>m(k=>s+=a[i][k]*r[k][j],s=0)&&s)),m=g=>a.map((_,n)=>g(n)),r=m(i=>m(j=>+!(i^j))))&&r

132 baytlık bir sürümü kullandım reduceama asık sık eşleştiriyordum , bunu yapmak için bir yardımcı işlev yazmak için 9 bayt daha kısa olduğu ortaya çıktı. Kimlik matrisini oluşturarak ve auzun ellerle çarparak çalışır n. Geri dönen 0veya gelen birtakım ifadeler var 1, i == jancak hepsi 7 bayt uzunluğunda görünüyor.



1

R, 49 bayt

f=function(m,n)`if`(n,m%*%f(m,n-1),diag(nrow(m)))

Bir matrix ve tekrarlama gücünü alan özyinelemeli işlev n. %*%Noktalı ürünü hesaplayan yinelemeli çağrılar . Özyineleme için ilk değer, aynı boyuttaki kimlik matrisidir m. Çünkü m %*% m = m %*% m %*% I, bu iyi çalışıyor.


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.