找出3 x 3矩阵的逆矩阵


22

挑战

给定九个数字,a, b, c, d, e, f, g, h, i作为与平方矩阵相对应的输入:

M=(abcdefghi

求矩阵的逆M1个并输出其分量。

逆矩阵

矩阵3乘3的逆遵循以下方程式:

中号中号-1个=中号-1个中号=一世=1个0001个0001个

可以计算为:

中号-1个=1个t中号CŤ

其中是辅助因子的矩阵:C

C=Ë一世-FHFG-d一世dH-ËGCH-b一世一种一世-CGbG-一种HbF-CËCd-一种F一种Ë-bd

和是转置:ÇCTC

CT=(eifhchbibfcefgdiaicgcdafdhegbgahaebd)

和是的行列式:Mdet(M)M

t中号=一种Ë一世-FH-bd一世-FG+CdH-ËG

工作实例

例如,假设输入为0, -3, -2, 1, -4, -2, -3, 4, 1。这对应于矩阵:

M=(032142341)

首先,让我们使用上面的公式来计算所谓的行列式:

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

接下来让我们计算辅助因子的矩阵:

C=-4×1个--2×4-1个×1个--2×-31个×4--4×-3--3×1个--2×40×1个--2×-3-0×4--3×-3-3×-2--2×-4-0×-2--2×1个0×-4--3×1个

=45-8-5-69-2-23

然后,我们需要转置(翻转行和列)以获得:C TCCŤ

CŤ=4-525-6-2-893

最后,我们可以找到逆为:

中号-1个=1个t中号CŤ=1个1个4-525-6-2-893=4-525-6-2-893

因此输出将是4, -5, -2, 5, -6, -2, -8, 9, 3

规则

  • 给定的矩阵将始终具有逆(即非奇异)。矩阵可以是自反的

  • 给定的矩阵将始终是具有9个整数的3×3矩阵

  • 输入中的数字将始终是范围内的整数-1000ñ1000

  • 矩阵的非整数分量可以以小数或小数形式给出

例子

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

获奖

以字节为单位的最短代码获胜。

Answers:


18

MATL,54字节

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

在线尝试!

只是为了使它有趣,不要使用内置的矩阵除法或行列式函数来做到这一点。

而是使用Sarrus规则计算行列式。

萨鲁斯示范法则

并使用Cayley-Hamilton公式进行转换(辅因子转置矩阵)。

调整一种=1个2TR一种2-TR一种2一世3-一种TR一种+一种2

注释代码:

% 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

我们可以去甚至更疯狂通过更换矩阵乘法素净GtY*为完成,喜欢的东西(尝试在MATL在线)。一种23:"Gt!@qYS*!s] 3$v t&v 3:K-&Xd

更直接,最明显的方法是:

4字节

-1Y^

在线尝试!

(由于@Luis Mendo,-1个字节。)

-1 -推字面-1

Y^ -将输入提高到该功率(隐式输入,隐式输出)


有趣的是,我从来不知道它被称为“萨鲁斯规则”。我的老师教了我们它,但是他是在大学时自己补上的。
Beta衰减

@LuisMendo谢谢,替换了简短的版本(以前的版本只是MATL手册中关于逆向的建议的盲目实现,没有实际的想法:))。对于长版本,我认为将其保留为这样稍微清晰一点,足以值得一字节命中。
sundar-恢复莫妮卡

1
@sundar嘿,我什至不记得那个建议。我也将添加矩阵幂的建议
Luis Mendo '18


9

R,51 35 27 8 5字节

solve

在线尝试!

首先要做这些高尔夫挑战之一。抱歉,如果我的格式错误!

感谢Giuseppe,共节省了11个字节!借助JAD,又节省了19个字节!


5
欢迎来到PPCG!
Beta Decay

从矩阵函数中删除了16个字节的参数变量名称!
罗伯特S.18年

1
真好!您可以删除大多数变量以节省字节,因为您实际上只是将操作链接在一起:请在线尝试!
朱塞佩

1
如果您要使用solve,则解决方案就是solve,因为它可以满足问题的所有要求。它以矩阵作为输入并返回一个矩阵。
JAD


4

果冻,3 个字节

æ*-

在线尝试!

假设我们可以接受输入并以2D整数列表形式提供。如果输入和输出确实需要一个整数整数列表,则格式适用于6个字节。


æ*--1个--1个

12
评论并不一定意味着长期存在。如果您在注释中包含解释,则应将其移至答案。

4

JavaScript(ES6),123字节

@ Mr.Xcoder节省了2个字节@ETHproductions
节省了1个字节

将输入作为9个不同的值。

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

在线尝试!


嘿,我现在允许内置矩阵函数。也就是说,如果JS有任何内容
Beta Decay'18

@BetaDecay JS没有任何内容。:-)
Arnauld



3

Python 2,139字节

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]

在线尝试!return不是print为了便于测试。)


1

干净的 143字节

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

在线尝试!


1

Python 3,77个字节

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

将输入作为平面列表。

如果将输入作为2D数组,则为63个字节:

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

0

Perl,226 + 4(-plF,标志)= 230字节

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

在线尝试



0

Noether,168个字节

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

在线尝试




0

Clojure,165个字节

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

抱歉,这会以转置方式输出C,而现在我懒于重新做那些长字符序列来修复它。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.