Znajdź odwrotność macierzy 3 na 3


22

Wyzwanie

Biorąc pod uwagę dziewięć liczb, a, b, c, d, e, f, g, h, ijako dane wejściowe odpowiadające macierzy kwadratowej:

M.=(zabdoremifasolhja)

Znajdź odwrotność macierzy, i wypisz jej składniki.M.-1

Matryca odwrotna

Odwrotność macierzy 3 na 3 jest zgodna z następującym równaniem:

M.M.-1=M.-1M.=ja=(100010001)

I można obliczyć jako:

M.-1=1det(M.)doT.

Gdzie jest matrycą kofaktorów:do

C=(eifhfgdidhegchbiaicgbgahbfcecdafaebd)

A jest transpozycją C :CTC

CT=(eifhchbibfcefgdiaicgcdafdhegbgahaebd)

A jest wyznacznikiem M :det(M)M

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

Przykład działania

Załóżmy na przykład, że dane wejściowe to 0, -3, -2, 1, -4, -2, -3, 4, 1. Odpowiada to macierzy:

M=(032142341)

Po pierwsze, obliczmy to, co jest znane jako wyznacznik, używając powyższego wzoru:

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

Następnie obliczmy macierz kofaktorów:

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)

Następnie musimy transponować (odwrócić wiersze i kolumny), aby uzyskać C T :dodoT.

doT.=(4-52)5-6-2)-893))

Wreszcie możemy znaleźć odwrotność jako:

M.-1=1det(M.)doT.=11(4-52)5-6-2)-893))=(4-52)5-6-2)-893))

Więc wynik byłby 4, -5, -2, 5, -6, -2, -8, 9, 3.

Zasady

  • Dana matryca zawsze będzie miała odwrotność (tzn. Nieparzysta). Macierz może być odwrotna do siebie

  • Podana macierz będzie zawsze macierzą 3 na 3 z 9 liczbami całkowitymi

  • Liczby na wejściu zawsze będą liczbami całkowitymi z zakresu 1000n1000

  • Niecałkowite składniki macierzy mogą być podawane w postaci dziesiętnej lub ułamkowej

Przykłady

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

Zwycięski

Najkrótszy kod w bajtach wygrywa.

Odpowiedzi:


18

MATL , 54 bajty

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

Wypróbuj online!

Żeby było interesujące, nie wykorzystuje do tego wbudowanego podziału macierzy ani funkcji determinujących.

Zamiast tego oblicza wyznacznik za pomocą reguły Sarrusa .

Demonstracja Reguły Sarrusa

I przylegająca (transponowana matryca kofaktora) przy użyciu wzoru Cayleya-Hamiltona .

przym(ZA)=12)((trZA)2)-trZA2))ja3)-ZAtrZA+ZA2).

Skomentowany 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

Moglibyśmy pójść jeszcze bardziej szalony czystszy, zastępując GtY*wykonane mnożenie macierzyZA2), z czymś takim 3:"Gt!@qYS*!s] 3$v t&v 3:K-&Xd( Wypróbuj w MATL Online ).

Bardziej bezpośredni i oczywisty sposób:

4 bajty

-1Y^

Wypróbuj online!

(-1 bajt dzięki @Luis Mendo.)

-1 - Naciśnij literał -1

Y^ - Podnieś moc wejściową do tej mocy (wartość domyślna, wartość domyślna)


Interesting, I never knew it was called the “Rule of Sarrus”. My teacher taught us it, but he had made it up himself while at uni.
Beta Decay

@LuisMendo Thanks, replaced the short version (tbh the previous version was just a blind implementation of the MATL manual's suggestion for inverse, no actual thinking went into that one :) ). For the long version, I think it's a tiny bit clearer to leave it as such, enough to be worth taking a 1 byte hit.
sundar - Reinstate Monica

1
@ Sundar Heh, nawet nie pamiętałem tej sugestii. Dodam też sugestię mocy matrycy
Luis Mendo


9

R, 51 35 27 8 5 bajtów

solve

Wypróbuj online!

Najpierw wykonaj jedno z tych wyzwań golfowych. Przepraszam, jeśli moje formatowanie jest nieprawidłowe!

Zaoszczędzono dodatkowo 11 bajtów dzięki Giuseppe! Zaoszczędź dodatkowe 19 bajtów dzięki JAD!


5
Witamy w PPCG!
Beta Decay

Usunięto nazwy zmiennych parametrów z funkcji macierzy, która odjęła 16 bajtów!
Robert S.

1
Miły! Możesz usunąć większość zmiennych, aby zaoszczędzić bajty, ponieważ tak naprawdę łączysz operacje razem: spróbuj online!
Giuseppe

1
Jeśli zamierzasz użyć solve, rozwiązanie jest po prostu solve, ponieważ spełnia wszystkie wymagania pytania. Pobiera macierz jako dane wejściowe i zwraca macierz.
JAD


4

Galaretka , 3 bajty

æ*-

Wypróbuj online!

Zakładając, że możemy wziąć dane wejściowe i podać jako listę liczb całkowitych 2D. Jeśli naprawdę wymagana jest płaska lista liczb całkowitych zarówno dla wejścia, jak i wyjścia, działa to dla 6 bajtów.


Objaśnienie (nie sądzę, aby warto było w odpowiedzi): æ*- wykładnik macierzy, -- wykładnik, który jest równy-1. -jest znakiem składni literałów ujemnych, ale domyślnie jest to-1gdy po nim nie ma numeru.
Pan Xcoder,

12
Komentarze niekoniecznie muszą być długo żywe. Jeśli do komentarza dołączasz wyjaśnienie, przenieś je do odpowiedzi.
Poke

4

JavaScript (ES6), 123 bajty

Zapisano 2 bajty dzięki @ Mr.Xcoder
Zapisano 1 bajt dzięki @ETHproductions

Przyjmuje dane wejściowe jako 9 różnych wartości.

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

Wypróbuj online!


Hej, pozwoliłem teraz na wbudowane funkcje macierzy. To znaczy, jeśli JS ma jakiś
Rozpad Beta

@BetaDecay JS nie ma. :-)
Arnauld

Czy te wsporniki są naprawdę potrzebne?
Pan Xcoder


3

Python 2 , 139 bajtów

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]

Wypróbuj online! ( returnZamiast tego printdla ułatwienia testowania.)



1

Python 3, 77 bajtów

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

Pobiera dane wejściowe jako płaską listę.

Ma 63 bajty, jeśli dane wejściowe są traktowane jako tablica 2D:

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

0

Perl, 226 + 4 ( -plF,flaga) = 230 bajtów

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

Wypróbuj online .


0

Perl 5, 179 bajtów

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}

Wypróbuj online .


0

Noether, 168 bajtów

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

Wypróbuj online




0

Clojure, 165 bajtów

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

Przykro mi, że dane wyjściowe C są transponowane i czuję się leniwy, aby ponownie wykonać te długie sekwencje postaci, aby to naprawić.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.