Temukan kebalikan dari matriks 3 oleh 3


22

Tantangan

Diberikan sembilan angka,, a, b, c, d, e, f, g, h, isebagai input yang sesuai dengan matriks kuadrat:

M=(abcdefghi)

Temukan kebalikan dari matriks, dan output komponen-komponennya.M1

Matriks Terbalik

Kebalikan dari matriks 3 oleh 3 mematuhi persamaan berikut:

MM1=M1M=I=(100010001)

Dan dapat dihitung sebagai:

M1=1det(M)CT

Di mana C adalah matriks kofaktor:

C=(eifhfgdidhegchbiaicgbgahbfcecdafaebd)

Dan CT adalah transposisi dari C :

CT=(eifhchbibfcefgdiaicgcdafdhegbgahaebd)

Dan adalah penentu :Mdet(M)M

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

Contoh yang berhasil

Sebagai contoh, katakanlah inputnya 0, -3, -2, 1, -4, -2, -3, 4, 1. Ini sesuai dengan matriks:

M=(032142341)

Pertama, mari kita hitung apa yang dikenal sebagai penentu menggunakan rumus di atas:

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

Selanjutnya mari kita hitung matriks kofaktor:

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)

Kita kemudian perlu mengubah posisi (membalik baris dan kolom) untuk mendapatkan :C TCCT

CT=(452562893)

Akhirnya, kita dapat menemukan kebalikannya sebagai:

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

Jadi hasilnya akan 4, -5, -2, 5, -6, -2, -8, 9, 3.

Aturan

  • Matriks yang diberikan akan selalu memiliki invers (yaitu non-singular). Matriksnya mungkin terbalik sendiri

  • Matriks yang diberikan akan selalu berupa matriks 3 by 3 dengan 9 bilangan bulat

  • Angka-angka dalam input akan selalu bilangan bulat dalam rentang1000n1000

  • Komponen non-integer dari matriks dapat diberikan sebagai desimal atau pecahan

Contohnya

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

Kemenangan

Kode terpendek dalam byte menang.

Jawaban:


18

MATL , 54 byte

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

Cobalah online!

Untuk membuatnya tetap menarik, jangan gunakan divisi matriks bawaan atau fungsi penentu untuk melakukannya.

Sebagai gantinya, hitung determinan menggunakan Aturan Sarrus .

Demonstrasi aturan Sarrus

Dan adjugate (transposed cofactor matrix) menggunakan rumus Cayley-Hamilton .

adj(SEBUAH)=12((trSEBUAH)2-trSEBUAH2)saya3-SEBUAHtrSEBUAH+SEBUAH2.

Kode yang dikomentari:

% 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

Kita bahkan bisa menjadi lebih gila dengan mengganti perkalian matriks yang GtY*dilakukan untuk , dengan sesuatu seperti ( Cobalah di MATL Online ).SEBUAH23:"Gt!@qYS*!s] 3$v t&v 3:K-&Xd

Cara yang lebih langsung dan jelas:

4 byte

-1Y^

Cobalah online!

(-1 byte terima kasih kepada @Luis Mendo.)

-1 - Dorong literal -1

Y^ - Naikkan input ke kekuatan itu (input implisit, output implisit)


Menarik, saya tidak pernah tahu itu disebut "Aturan Sarrus". Guru saya mengajari kami hal itu, tetapi ia telah membuatnya sendiri saat di uni.
Beta Decay

@LuisMendo Terima kasih, mengganti versi pendek (tbh versi sebelumnya hanya implementasi buta dari saran manual MATL untuk invers, tidak ada pemikiran yang sebenarnya masuk ke yang :)). Untuk versi panjang, saya pikir ini sedikit lebih jelas untuk membiarkannya, cukup layak untuk mendapatkan hit 1 byte.
sundar - Reinstate Monica

1
@sundar Heh, saya bahkan tidak ingat saran itu. Saya akan menambahkan saran kekuatan matriks juga
Luis Mendo


9

R, 51 35 27 8 5 byte

solve

Cobalah online!

Pertama lakukan salah satu tantangan golf ini. Maaf jika pemformatan saya salah!

Menyimpan total 11 byte tambahan berkat Giuseppe! Menyimpan 19 byte tambahan berkat JAD!


5
Selamat datang di PPCG!
Beta Decay

Menghapus nama variabel parameter dari fungsi matriks yang mengurangi 16 byte!
Robert S.

1
Bagus! Anda dapat menghapus sebagian besar variabel untuk menghemat byte karena Anda benar-benar hanya merantai operasi bersama-sama: coba online!
Giuseppe

1
Jika Anda akan menggunakan solve, solusinya adil solve, karena memenuhi semua persyaratan pertanyaan. Dibutuhkan matriks sebagai input dan mengembalikan matriks.
JAD


4

Jelly , 3 byte

æ*-

Cobalah online!

Dengan asumsi kita dapat mengambil input dan memberikan daftar bilangan bulat 2D. Jika daftar datar bilangan bulat benar-benar diperlukan untuk input dan output, maka ini berfungsi selama 6 byte.


æ*-1-1

12
Komentar tidak harus berumur panjang. Jika Anda memasukkan penjelasan dalam komentar, Anda harus memindahkannya ke jawabannya.
Poke

4

JavaScript (ES6), 123 byte

Disimpan 2 byte berkat @ Mr.Xcoder
Disimpan 1 byte berkat @ETHproduksi

Mengambil input sebagai 9 nilai berbeda.

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

Cobalah online!


Hei, saya sudah mengizinkan fungsi matriks bawaan sekarang. Artinya, jika JS memiliki
Beta Decay

@BetaDecay JS tidak punya. :-)
Arnauld

Apakah tanda kurung itu benar -
Tn. Xcoder


3

Python 2 , 139 byte

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]

Cobalah online! (Telah returnbukannya printuntuk kemudahan pengujian.)


1

Bersih , 143 byte

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]]

Cobalah online!


1

Python 3, 77 byte

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

Mengambil input sebagai daftar datar.

Ini 63 byte jika input diambil sebagai array 2D:

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

0

Perl, 226 + 4 ( -plF,flag) = 230 byte

$_=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

Cobalah online .


0

Perl 5, 179 byte

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}

Cobalah online .


0

Noether, 168 byte

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

Cobalah online




0

Clojure, 165 byte

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

Saya minta maaf ini menghasilkan C dalam transpos, dan saya merasa malas untuk melakukan kembali urutan karakter panjang untuk memperbaikinya saat ini.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.