Tìm nghịch đảo của ma trận 3 nhân 3


22

Thử thách

Cho chín số, a, b, c, d, e, f, g, h, ilàm đầu vào tương ứng với ma trận vuông:

M=(abcdefghi)

Tìm nghịch đảo của ma trận, M1 và xuất các thành phần của nó.

Ma trận nghịch đảo

Nghịch đảo của ma trận 3 bằng 3 tuân theo phương trình sau:

MM1=M1M=I=(100010001)

Và có thể được tính như sau:

M1=1det(M)CT

Trong đó C là ma trận của các đồng yếu tố:

C=(eifhfgdidhegchbiaicgbgahbfcecdafaebd)

Và là hoán vị của :CCTC

CT=(eifhchbibfcefgdiaicgcdafdhegbgahaebd)

Và là yếu tố quyết định của :Mdet(M)M

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

Ví dụ làm việc

Ví dụ, giả sử đầu vào là 0, -3, -2, 1, -4, -2, -3, 4, 1. Điều này tương ứng với ma trận:

M=(032142341)

Đầu tiên, hãy tính toán cái được gọi là định thức bằng công thức trên:

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

Tiếp theo hãy tính ma trận của các đồng yếu tố:

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)

Sau đó chúng ta cần hoán đổi (lật các hàng và cột) để có được C T :CCT

CT=(452562893)

Cuối cùng, chúng ta có thể tìm thấy nghịch đảo như:

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

Vì vậy, đầu ra sẽ là 4, -5, -2, 5, -6, -2, -8, 9, 3.

Quy tắc

  • Ma trận đã cho sẽ luôn có một nghịch đảo (tức là không đơn). Ma trận có thể tự đảo ngược

  • Ma trận đã cho sẽ luôn là ma trận 3 nhân 3 với 9 số nguyên

  • Những con số trong đầu vào sẽ luôn là số nguyên trong phạm vi -1000n1000

  • Các thành phần không nguyên của ma trận có thể được đưa ra dưới dạng thập phân hoặc phân số

Ví dụ

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

Chiến thắng

Mã ngắn nhất tính bằng byte thắng.

Câu trả lời:


18

MATL , 54 byte

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

Hãy thử trực tuyến!

Để giữ cho nó thú vị, không sử dụng phân chia ma trận sẵn có hoặc các hàm xác định để thực hiện.

Thay vào đó, tính toán định thức bằng cách sử dụng Quy tắc Sarrus .

Quy tắc biểu tình của Sarrus

Và phép liên hợp (ma trận đồng biến đổi) sử dụng công thức Cayley của Hamilton .

tính từ(Một)= =12((trMột)2-trMột2)tôi3-MộttrMột+Một2.

Mã nhận xét:

% 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

Chúng ta có thể đi thậm chí mất trí hơn tinh khiết bằng cách thay thế nhân ma trận GtY*làm cho , với một cái gì đó giống như ( Thử nó trên MATL trực tuyến ).Một23:"Gt!@qYS*!s] 3$v t&v 3:K-&Xd

Cách trực tiếp và rõ ràng hơn:

4 byte

-1Y^

Hãy thử trực tuyến!

(-1 byte nhờ @Luis Mendo.)

-1 - Đẩy chữ -1

Y^ - Nâng đầu vào lên mức đó (đầu vào ngầm, đầu ra ngầm)


Thật thú vị, tôi không bao giờ biết nó được gọi là Quy tắc của Sarrus. Giáo viên của tôi đã dạy chúng tôi điều đó, nhưng anh ấy đã tự mình làm điều đó khi còn ở uni.
Beta Decay

@LuisMendo Cảm ơn, đã thay thế phiên bản ngắn (tbh phiên bản trước chỉ là một triển khai mù của đề xuất hướng dẫn MATL cho nghịch đảo, không có suy nghĩ thực tế nào đi vào đó :)). Đối với phiên bản dài, tôi nghĩ rằng việc để nó như vậy rõ ràng hơn một chút, đủ để có giá trị 1 byte.
- Phục hồi Monica

1
@sundar Heh, tôi thậm chí không nhớ đề nghị đó. Tôi cũng sẽ thêm đề xuất về sức mạnh ma trận
Luis Mendo


9

R, 51 35 27 8 5 byte

solve

Hãy thử trực tuyến!

Đầu tiên hãy thực hiện một trong những thử thách golf này. Xin lỗi nếu định dạng của tôi là sai!

Đã lưu tổng cộng 11 byte nhờ Giuseppe! Đã lưu thêm 19 byte nhờ JAD!


5
Chào mừng đến với PPCG!
Beta Decay

Đã xóa tên biến tham số khỏi hàm ma trận trừ 16 byte!
Robert S.

1
Tốt đẹp! Bạn có thể loại bỏ hầu hết các biến để lưu byte vì bạn thực sự chỉ kết nối các hoạt động với nhau: thử trực tuyến!
Giuseppe

1
Nếu bạn sẽ sử dụng solve, giải pháp chỉ là solve, vì nó đáp ứng tất cả các yêu cầu của câu hỏi. Nó nhận một ma trận làm đầu vào và trả về một ma trận.
JAD


4

Thạch , 3 byte

æ*-

Hãy thử trực tuyến!

Giả sử chúng ta có thể lấy đầu vào và cung cấp dưới dạng danh sách 2D các số nguyên. Nếu một danh sách phẳng các số nguyên thực sự cần thiết cho cả đầu vào và đầu ra, thì điều này hoạt động với 6 byte.


Giải thích (Tôi không nghĩ nó có giá trị bao gồm trong câu trả lời): æ*- lũy thừa ma trận, -- số mũ, bằng-1. -là một ký tự cú pháp cho nghĩa đen nhưng nó mặc định là-1khi không có số ngay sau nó
Ông Xcoder

12
Bình luận không nhất thiết phải sống lâu. Nếu bạn bao gồm một lời giải thích trong các bình luận, thay vào đó bạn nên chuyển nó sang câu trả lời.
Chọc

4

JavaScript (ES6), 123 byte

Đã lưu 2 byte nhờ @ Mr.Xcoder
Đã lưu 1 byte nhờ @ETHproductions

Lấy đầu vào là 9 giá trị riêng biệt.

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

Hãy thử trực tuyến!


Này, tôi đã cho phép các hàm ma trận tích hợp ngay bây giờ. Đó là, nếu JS có bất kỳ
Beta Decay

@BetaDecay JS không có. :-)
Arnauld

Là những dấu ngoặc thực sự cần thiết?
Ông 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]

Hãy thử trực tuyến! (Có returnthay vì printđể dễ kiểm tra.)



1

Python 3, 77 byte

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

Đưa đầu vào như một danh sách phẳng.

Đó là 63 byte nếu đầu vào được lấy dưới dạng mảng 2D:

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

0

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

Hãy thử trực tuyến .


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}

Hãy thử trực tuyến .





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

Tôi xin lỗi điều này khiến C chuyển đổi và tôi cảm thấy lười biếng khi thực hiện lại các chuỗi ký tự dài đó để khắc phục nó vào lúc này.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.