3'e 3'lük bir matrisin tersini bulun


22

Meydan okuma

a, b, c, d, e, f, g, h, iKare matrise karşılık gelen girdi olarak dokuz sayı verilmiştir :

M=(abcdefghi)

matrisinin tersini bulun M1ve bileşenlerini çıkartın.

Ters Matris

Bir matrisin 3'e 3 tersi tersi aşağıdaki denklemi yerine getirir:

MM1=M1M=I=(100010001)

Ve şu şekilde hesaplanabilir:

M1=1det(M)CT

Burada kofaktörlerin bir matristir:C

C=(eifhfgdidhegchbiaicgbgahbfcecdafaebd)

Ve , :CCTC

CT=(eifhchbibfcefgdiaicgcdafdhegbgahaebd)

Ve belirleyicisi :Mdet(M)M

det(M)=a(eifh)b(difg)+c(dheg)

Çalıştı örnek

Örneğin, girdi diyelim 0, -3, -2, 1, -4, -2, -3, 4, 1. Bu matrise karşılık gelir:

M=(032142341)

İlk olarak, yukarıdaki formülü kullanarak determinant olarak bilinenleri hesaplayalım:

det(M)=0(4×1(2)×4)(3)(1×1(2)×3)+(2)(1×4(4)×3)=1

Şimdi kofaktörlerin matrisini hesaplayalım:

C=(4×1(2)×4(1×1(2)×3)1×4(4)×3(3×1(2)×4)0×1(2)×3(0×4(3)×3)3×2(2)×4(0×2(2)×1)0×4(3)×1)

=(458569223)

Sonra devrik gerek olsun (satır ve sütun çevirme) :C TCCT

CT=(452562893)

Son olarak, tersini şu şekilde bulabiliriz:

M1=1det(M)CT=11(452562893)=(452562893)

Yani çıktı olacaktı 4, -5, -2, 5, -6, -2, -8, 9, 3.

kurallar

  • Verilen matris her zaman bir tersine sahip olacaktır (yani tekil olmayan). Matris kendi kendine ters olabilir

  • Verilen matris her zaman 9 tamsayılı 3 x 3 matris olur

  • sayılar her zaman aralığında tamsayılar olur1000n1000

  • Matrisin tamsayı olmayan bileşenleri ondalık ya da kesir olarak verilebilir

Örnekler

Input > Output
1, 0, 0, 0, 1, 0, 0, 0, 1 > 1, 0, 0, 0, 1, 0, 0, 0, 1
0, -3, -2, 1, -4, -2, -3, 4, 1 > 4, -5, -2, 5, -6, -2, -8, 9, 3
1, 2, 3, 3, 1, 2, 2, 1, 3 > -1/6, 1/2, -1/6, 5/6, 1/2, -7/6, -1/6, -1/2, 5/6
7, 9, 4, 2, 7, 9, 3, 4, 5 > -1/94, -29/94, 53/94, 17/94, 23/94, -55/94, -13/94, -1/94, 31/94

Kazanan

Bayt cinsinden en kısa kod kazanır.

Yanıtlar:


18

MATL , 54 bayt

th3LZ)t,3:q&XdpswP]w-lw/GtY*tXdsGXdsUw-IXy*2/+GtXds*-*

Çevrimiçi deneyin!

Sadece ilginç kılmak için, yerleşik matris bölümünü veya belirleyici işlevleri kullanmaz.

Bunun yerine, determinantı Sarrus Kuralı kullanarak hesaplar .

Sarrus Kuralı gösteri

Ve Cayley-Hamilton formülü kullanılarak adjuvan (transpozisyonlu kofaktör matrisi) .

adj(bir)=12((trbir)2-trbir2)ben3-birtrbir+bir2.

Yorumlanan kod:

% Finding determinant
th    % concatenate the matrix to itself sideways
3LZ)  % chop off the last column (since the Rule of Sarrus doesn't need it)
t     % duplicate this matrix (say S)
,     % do this twice:
  3:q&Xd  % get the first three diagonals of S
  ps      % multiply each diagonal's values and add the results
  wP      % switch and flip the matrix (to get the popposing diagonals next time)
]w    % close loop, switch to have correct order of sums
-     % subtract - we now have the determinant
lw/   % invert that

% Finding adjugate using Cayley–Hamilton formula
GtY*  % A^2 term (last term of the formula)
tXds  % trace(A^2) for term 1 of formula
GXdsU % (trace(A))^2 for term1 of formula
w-    % (trace(A))^2 - trace(A^2)
IXy*  % multiply that by the identity matrix
2/    % divide that by 2 - term 1 complete
+
GtXds* % A*trA for term 2 of formula
-      % subtract to get adj(A)

*      % multiply by the inverse of determinant we found earlier
       % implicit output

A 2 için yapılan matris çarpımını ( MATL Online'da deneyin) gibi bir şeyle değiştirerek daha da çılgınca gidebiliriz .GtY*bir23:"Gt!@qYS*!s] 3$v t&v 3:K-&Xd

Daha doğrudan ve açık bir şekilde:

4 bayt

-1Y^

Çevrimiçi deneyin!

(@Luis Mendo sayesinde -1 bayt.)

-1 - değişmez -1 itin

Y^ - Girişi bu güce yükseltin (örtülü giriş, örtük çıkış)


İlginç, “Sarrus Kuralı” olarak adlandırıldığını asla bilmiyordum. Öğretmenim bize öğretti, ancak üniversitedeyken kendini telafi etti.
Beta Decay,

@LuisMendo Teşekkürler, kısa versiyonun yerine geçti (önceki versiyon, MATL kılavuzunun tersine önerisinin sadece kör bir uygulamasıydı, bunun üzerine gerçek bir düşünce gelmedi :)). Uzun versiyon için, 1 baytlık bir çekim yapmaya değecek kadar açık bırakmak biraz daha net olduğunu düşünüyorum.
sundar - Reinstate Monica

1
@ Sundar Heh, bu öneriyi bile hatırlamadım. Matris gücünün önerisini de ekleyeceğim
Luis Mendo


9

R, 51 35 27 8 5 bayt

solve

Çevrimiçi deneyin!

İlk önce bu golf zorluklarından birini yapmaya gidin. Biçimlendirmem yanlışsa üzgünüm!

Giuseppe sayesinde toplam 11 bayt daha kaydedildi! JAD sayesinde 19 bayt daha kaydedildi!


5
PPCG'ye Hoşgeldiniz!
Beta Decay,

Parametre değişkeni adları, 16 byte çıkaran matris fonksiyonundan kaldırıldı!
Robert S.,

1
Güzel! İşlemleri gerçekten zincirlemiş olduğunuzdan, baytları korumak için değişkenlerin çoğunu kaldırabilirsiniz: çevrimiçi deneyin!
Giuseppe

1
Kullanacaksanız solve, çözüm, solvesorunun tüm gereklerini yerine getirdiği gibi. Giriş olarak bir matris alır ve bir matris döndürür.
JAD,


4

Jöle , 3 bayt

æ*-

Çevrimiçi deneyin!

Girdi alabileceğimizi ve 2 boyutlu bir tamsayı listesi sağlayabileceğimizi varsayalım. Hem girdi hem de çıktı için düz bir tamsayı listesi gerekiyorsa, bu 6 bayt için işe yarar.


æ*--1--1

12
Yorumlar mutlaka uzun ömürlü olmak zorunda değildir. Yorumlara bir açıklama ekliyorsanız, bunun yerine cevaba taşımalısınız.
Poke

4

JavaScript (ES6), 123 bayt

@ Mr.Xcoder sayesinde 2 bayt kaydedildi @ETHproductions
sayesinde 1 bayt kaydedildi

Girdiyi 9 ayrı değer olarak alır.

(a,b,c,d,e,f,g,h,i)=>[x=e*i-h*f,c*h-b*i,b*f-c*e,y=f*g-d*i,a*i-c*g,d*c-a*f,z=d*h-g*e,g*b-a*h,a*e-d*b].map(v=>v/=a*x+b*y+c*z)

Çevrimiçi deneyin!


Hey, şimdi yerleşik matris fonksiyonlarına izin verdim. Bu, eğer JS varsa
Beta Decay

@BetaDecay JS'de hiç yok. :-)
Arnauld

Bu braketler gerçekten gerekli mi?
Bay Xcoder


3

Python 2 , 139 bayt

def F(a,b,c,d,e,f,g,h,i):x=e*i-f*h;y=f*g-d*i;z=d*h-e*g;print[j/(a*x+b*y+c*z)for j in x,c*h-b*i,b*f-c*e,y,a*i-c*g,c*d-a*f,z,b*g-a*h,a*e-b*d]

Çevrimiçi deneyin! ( Test kolaylığı için returnyerine sahiptir print.)


1

Temiz , 143 bayt

import StdEnv
$a b c d e f g h i#p=e*i-h*f
#q=f*g-d*i
#r=d*h-g*e
=[v/(a*p+b*q+c*r)\\v<-[p,c*h-b*i,b*f-c*e,q,a*i-c*g,d*c-a*f,r,g*b-a*h,a*e-d*b]]

Çevrimiçi deneyin!


1

Python 3, 77 bayt

import numpy
lambda l:(numpy.matrix(l).reshape(-1,3)**-1).ravel().tolist()[0]

Girişi düz bir liste olarak alır.

Giriş 2B dizi olarak alınırsa 63 bayttır:

import numpy
lambda l:(numpy.matrix(l)**-1).ravel().tolist()[0]

0

Perl, 226 + 4 ( -plF,bayrak) = 230 bayt

$_=join', ',map$_/($a*$x+$b*$y+$c*$z),$x=($e=$F[4])*($i=$F[8])-($f=$F[5])*($h=$F[7]),($c=$F[2])*$h-($b=$F[1])*$i,$b*$f-$c*$e,$y=$f*($g=$F[6])-($d=$F[3])*$i,($a=$F[0])*$i-$c*$g,$c*$d-$a*$f,$z=$d*$h-$e*$g,$b*$g-$a*$h,$a*$e-$b*$d

Çevrimiçi deneyin .


0

Perl 5, 179 bayt

sub{($a,$b,$c,$d,$e,$f,$g,$h,$i)=@_;map$_/($a*$x+$b*$y+$c*$z),$x=$e*$i-$f*$h,$c*$h-$b*$i,$b*$f-$c*$e,$y=$f*$g-$d*$i,$a*$i-$c*$g,$c*$d-$a*$f,$z=$d*$h-$e*$g,$b*$g-$a*$h,$a*$e-$b*$d}

Çevrimiçi deneyin .


0

Noether, 168 bayt

I~aI~bI~cI~dI~eI~fI~gI~hI~iei*fh*-a*di*fg*-b*-dh*eg*-c*+~zei*fh*-z/P","~nPch*bi*-z/PnPbf*ce*-z/PnPfg*di*-z/PnPai*cg*-z/PnPcd*af*-z/PnPdh*eg*-z/PnPbg*ah*-z/PnPae*bd*-z/P

Çevrimiçi deneyin




0

Clojure, 165 bayt

(fn[a b c d e f g h i](let[M map C(M -(M *[e f d c a b b c a][i g h h i g f d e])(M *[f d e b c a c a b][h i g i g h e f d]))](for[i C](/ i(apply +(M *[a b c]C))))))

Üzgünüm bu transpozisyonda C çıktı ve şu anda düzeltmek için bu uzun karakter dizilerini tekrar yapmak için tembel hissediyorum.


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.