Trova l'inverso di una matrice 3 per 3


22

Sfida

Dati nove numeri, a, b, c, d, e, f, g, h, icome input che corrispondono alla matrice quadrata:

M=(abcdefghi)

Trova l'inverso della matrice, e crea i suoi componenti.M1

Matrice inversa

L'inverso di una matrice 3 per 3 obbedisce alla seguente equazione:

MM1=M1M=I=(100010001)

E può essere calcolato come:

M1=1det(M)CT

Dove C è la matrice dei cofattori:

C=(eifhfgdidhegchbiaicgbgahbfcecdafaebd)

E CT è la trasposizione di C :

CT=(eifhchbibfcefgdiaicgcdafdhegbgahaebd)

E det(M) è il determinante di M :

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

Esempio lavorato

Ad esempio, supponiamo che l'input sia 0, -3, -2, 1, -4, -2, -3, 4, 1. Questo corrisponde alla matrice:

M=(032142341)

Innanzitutto, calcoliamo ciò che è noto come determinante utilizzando la formula sopra:

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

Quindi calcoliamo la matrice dei cofattori:

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)

Dobbiamo quindi trasporre (capovolgere le righe e le colonne) per ottenere :C TCCT

CT=(452562893)

Finalmente possiamo trovare l'inverso come:

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

Quindi l'output sarebbe 4, -5, -2, 5, -6, -2, -8, 9, 3.

Regole

  • La matrice data avrà sempre un inverso (cioè non singolare). La matrice può essere auto-inversa

  • La matrice data sarà sempre una matrice 3 per 3 con 9 numeri interi

  • I numeri nell'input saranno sempre numeri interi compresi nell'intervallo1000n1000

  • I componenti non interi della matrice possono essere indicati come decimali o frazione

Esempi

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

vincente

Vince il codice più breve in byte.

Risposte:


18

MATL , 54 byte

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

Provalo online!

Giusto per mantenerlo interessante, non usa la divisione matrice integrata o le funzioni determinanti per farlo.

Invece, calcola il determinante usando la Regola di Sarrus .

Dimostrazione della Regola di Sarrus

E l'adiugato (matrice di cofattore trasposta) usando la formula di Cayley-Hamilton .

adj(A)=12((trA)2trA2)I3AtrA+A2.

Codice commentato:

% 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

Potremmo diventare ancora più folli sostituendo la moltiplicazione di matrice GtY*fatta per , con qualcosa del tipo ( Provalo su MATL Online ).A23:"Gt!@qYS*!s] 3$v t&v 3:K-&Xd

Il modo più diretto e ovvio:

4 byte

-1Y^

Provalo online!

(-1 byte grazie a @Luis Mendo.)

-1 - Premere letteralmente -1

Y^ - Aumenta l'input a quella potenza (input implicito, output implicito)


Interessante, non ho mai saputo che fosse chiamata la "Regola di Sarrus". Il mio insegnante ce lo ha insegnato, ma se l'era inventato da solo mentre era all'università.
Decadimento beta

@LuisMendo Grazie, sostituita la versione breve (ma la versione precedente era solo un'implementazione cieca del suggerimento del manuale MATL per l'inverso, nessun pensiero reale è entrato in quello :)). Per la versione lunga, penso che sia un po 'più chiaro lasciarlo come tale, abbastanza per valere la pena di colpire 1 byte.
Sundar - Ripristina Monica il

1
@sundar Heh, non ricordavo nemmeno quel suggerimento. Aggiungerò anche il suggerimento del potere della matrice
Luis Mendo,


9

R, 51 35 27 8 5 byte

solve

Provalo online!

Prima vai a fare una di queste sfide da golf. Scusate se la mia formattazione è sbagliata!

Risparmio di ulteriori 11 byte grazie a Giuseppe! Risparmiato altri 19 byte grazie a JAD!


5
Benvenuti in PPCG!
Decadimento beta

Rimossi i nomi delle variabili dei parametri dalla funzione matrice che ha sottratto 16 byte!
Robert S.

1
Bello! Puoi rimuovere la maggior parte delle variabili per salvare i byte poiché stai semplicemente concatenando le operazioni: provale online!
Giuseppe,

1
Se hai intenzione di utilizzare solve, la soluzione è giusta solve, poiché soddisfa tutti i requisiti della domanda. Prende una matrice come input e restituisce una matrice.
JAD,


4

Gelatina , 3 byte

æ*-

Provalo online!

Supponendo che possiamo prendere input e fornire come un elenco 2D di numeri interi. Se una semplice lista di numeri interi è effettivamente necessario per input e output, questo funziona per 6 byte.


æ*-1-1

12
I commenti non sono necessariamente destinati a durare a lungo. Se includi una spiegazione nei commenti, dovresti invece spostarla nella risposta.
Colpisci il

4

JavaScript (ES6), 123 byte

Salvato 2 byte grazie a @ Mr.Xcoder
Salvato 1 byte grazie a @ETHproductions

Accetta input come 9 valori distinti.

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

Provalo online!


Ehi, ora ho permesso le funzioni di matrice incorporate. Cioè, se JS ha
Decadimento beta

@BetaDecay JS non ne ha. :-)
Arnauld,

Quelle parentesi sono davvero necessarie?
Mr. 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]

Provalo online! (Ha returninvece di printfacilità di test.)


1

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

Provalo online!


1

Python 3, 77 byte

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

Accetta input come un elenco semplice.

Sono 63 byte se l'input è preso come un array 2D:

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

0

Perl, 226 + 4 ( -plF,bandiera) = 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

Provalo 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}

Provalo 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

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

Mi dispiace che questo abbia prodotto C in trasposizione, e mi sento pigro nel ripetere quelle lunghe sequenze di caratteri per sistemarlo al momento.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.