Finden Sie die Umkehrung einer 3 x 3-Matrix

22

Herausforderung

Bei neun Zahlen a, b, c, d, e, f, g, h, ials Eingabe, die der Quadratmatrix entsprechen:

M=(abcdefghi)

Finden Sie die Inverse der Matrix und geben Sie ihre Komponenten aus.M1

Inverse Matrix

Das Inverse einer Matrix 3 mal 3 folgt der folgenden Gleichung:

MM1=M1M=I=(100010001)

Und kann wie folgt berechnet werden:

M1=1det(M)CT

Wobei die Matrix der Cofaktoren ist:C

C=(eifhfgdidhegchbiaicgbgahbfcecdafaebd)

Und ist die transponierte C :CTC

CT=(eifhchbibfcefgdiaicgcdafdhegbgahaebd)

Und ist die Determinante von M :det(M)M

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

Gearbeitetes Beispiel

Angenommen, die Eingabe lautet 0, -3, -2, 1, -4, -2, -3, 4, 1. Dies entspricht der Matrix:

M=(032142341)

Berechnen wir zunächst die so genannte Determinante mit der obigen Formel:

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

Als nächstes berechnen wir die Matrix der Cofaktoren:

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)

Wir müssen dann transponieren (Flip die Zeilen und Spalten) zu erhalten C T :CCT

CT=(452562893)

Schließlich können wir die Inverse finden als:

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

So wäre die Ausgabe 4, -5, -2, 5, -6, -2, -8, 9, 3.

Regeln

  • Die angegebene Matrix hat immer eine Umkehrung (dh keine Singularität). Die Matrix kann selbstinvers sein

  • Die angegebene Matrix ist immer eine 3 x 3-Matrix mit 9 ganzen Zahlen

  • Die Zahlen in der Eingabe sind immer ganze Zahlen im Bereich 1000n1000

  • Nicht ganzzahlige Komponenten der Matrix können als Dezimalzahl oder als Bruchzahl angegeben werden

Beispiele

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

Gewinnen

Der kürzeste Code in Bytes gewinnt.

Beta-Zerfall
quelle

Antworten:

18

MATL , 54 Bytes

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

Probieren Sie es online!

Nur um es interessant zu halten, verwenden Sie nicht die eingebaute Matrixdivision oder die Determinantenfunktionen, um dies zu tun.

Berechnet stattdessen die Determinante mithilfe der Regel von Sarrus .

Regel der Sarrus-Demonstration

Und das Adjugat (transponierte Cofaktormatrix) nach der Cayley-Hamilton-Formel .

adj(EIN)=12((trEIN)2-trEIN2)ich3-EINtrEIN+EIN2.

Kommentierter Code:

% 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

Wir könnten noch wahnsinniger werden , wenn wir die GtY*für Matrixmultiplikation durch etwas wie ( Try it on MATL Online ) ersetzen .EIN23:"Gt!@qYS*!s] 3$v t&v 3:K-&Xd

Der direktere und naheliegendere Weg:

4 Bytes

-1Y^

Probieren Sie es online!

(-1 Byte dank @Luis Mendo.)

-1 - Drücken Sie das Literal -1

Y^ - Erhöhen Sie die Eingabe auf diese Leistung (implizite Eingabe, implizite Ausgabe)

Sundar - Setzen Sie Monica wieder ein
quelle
Interessant, ich wusste nie, dass es die "Regel von Sarrus" genannt wurde. Mein Lehrer hat es uns beigebracht, aber er hat es sich selbst ausgedacht, als er an der Uni war.
Beta Decay
@LuisMendo Danke, die Kurzversion wurde ersetzt (obwohl die Vorgängerversion nur eine blinde Umsetzung des Vorschlags des MATL-Handbuchs für die Umkehrung war, ging kein wirkliches Denken in diese ein :)). Für die lange Version finde ich es ein kleines bisschen klarer, es als solches zu belassen, genug, um einen 1-Byte-Treffer wert zu sein.
Sundar - Reinstate Monica
1
@ Sundar Heh, ich erinnerte mich nicht einmal an diesen Vorschlag. Ich werde den Vorschlag der Matrixmacht auch hinzufügen
Luis Mendo
9

R, 51 35 27 8 5 Bytes

solve

Probieren Sie es online!

Machen Sie zuerst eine dieser Golfherausforderungen. Entschuldigung, wenn meine Formatierung falsch ist!

Dank Giuseppe wurden zusätzliche 11 Bytes eingespart! Dank JAD wurden weitere 19 Bytes eingespart!

Robert S.
quelle
5
Willkommen bei PPCG!
Beta Decay
Die Parametervariablennamen wurden aus der Matrixfunktion entfernt, die 16 Bytes subtrahierte!
Robert S.
1
Nett! Sie können die meisten Variablen entfernen, um Bytes zu sparen, da Sie die Operationen nur miteinander verketten: Probieren Sie es online aus!
Giuseppe
1
Wenn Sie verwenden möchten solve, ist die Lösung gerecht solve, da sie alle Anforderungen der Frage erfüllt. Es nimmt eine Matrix als Eingabe und gibt eine Matrix zurück.
JAD
1
so
Giuseppe
4

Gelee , 3 Bytes

æ*-

Probieren Sie es online!

Angenommen, wir können Eingaben vornehmen und eine 2D-Liste von ganzen Zahlen bereitstellen. Wenn eine flache Liste von ganzen Zahlen wirklich für Ein- und Ausgabe erforderlich ist, dann dies funktioniert für 6 Byte.

Mr. Xcoder
quelle
Erklärung (Ich glaube nicht, dass es wert ist, in die Antwort aufgenommen zu werden): æ*- Matrixexponentiation, -- Exponent, der gleich ist-1. -ist ein Syntaxzeichen für negative Literale, standardmäßig jedoch-1wenn es keine Nummer direkt danach gibt.
Mr. Xcoder
12
Kommentare müssen nicht unbedingt langlebig sein. Wenn Sie eine Erklärung in die Kommentare aufnehmen, sollten Sie diese stattdessen in die Antwort verschieben.
Poke
4

JavaScript (ES6), 123 Byte

2 Byte dank @ Mr.Xcoder
gespeichert 1 Byte dank @ETHproductions gespeichert

Nimmt die Eingabe als 9 verschiedene Werte an.

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

Probieren Sie es online!

Arnauld
quelle
Hey, ich habe jetzt eingebaute Matrixfunktionen zugelassen. Das heißt, wenn JS irgendwelche hat
Beta Decay
@BetaDecay JS hat keine. :-)
Arnauld
Werden diese Klammern wirklich benötigt?
Mr. Xcoder
3

Python 2 , 139 Bytes

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]

Probieren Sie es online! (Hat returnstatt printfür eine einfache Prüfung.)

Lynn
quelle
1

Sauber , 143 Bytes

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

Probieren Sie es online!

Οurous
quelle
1

Python 3, 77 Bytes

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

Nimmt die Eingabe als flache Liste.

Es sind 63 Bytes, wenn die Eingabe als 2D-Array verwendet wird:

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

Perl, 226 + 4 ( -plF,Flag) = 230 Bytes

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

Probieren Sie es online aus .

Denis Ibaev
quelle
0

Perl 5, 179 Bytes

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}

Probieren Sie es online aus .

Denis Ibaev
quelle
0

Nein, 168 Bytes

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

Probieren Sie es online aus

Beta-Zerfall
quelle
0

Google Sheets , 16 Bytes

=MINVERSE(A1:C3)

Die Eingabe liegt im Bereich A1:C3

Built-Ins sind langweilig

Ingenieur Toast
quelle
0

Clojure, 165 Bytes

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

Es tut mir leid, dass dies C in transponiert ausgibt, und ich fühle mich faul, diese langen Zeichenfolgen erneut zu machen, um es im Moment zu korrigieren.

NikoNyrh
quelle
0

APL (Dyalog), 7 Bytes

,⌹3 3⍴⎕

Nimmt Eingaben als flache Liste und gibt sie als flache Liste aus

Probieren Sie es online!

Beta-Zerfall
quelle