ค้นหาค่าผกผันของเมทริกซ์ 3 คูณ 3


22

ท้าทาย

รับตัวเลขเก้าตัว, a, b, c, d, e, f, g, h, iเป็นอินพุตซึ่งสอดคล้องกับเมทริกซ์จตุรัส:

M=(adอีก.ชั่วโมงผม)

ค้นหาค่าผกผันของเมทริกซ์, M-1และส่งออกส่วนประกอบ

เมทริกซ์ผกผัน

การผกผันของเมทริกซ์ 3 คูณ 3 ทำตามสมการต่อไปนี้:

MM-1=M-1M=ผม=(100010001)

และสามารถคำนวณได้ดังนี้

M-1=1เดชอุดม(M)CT

โดยที่เป็นเมทริกซ์ของโคแฟคเตอร์:C

C=(อีผม-ชั่วโมงก.-dผมdชั่วโมง-อีก.ชั่วโมง-ผมaผม-ก.ก.-aชั่วโมง-อีd-aaอี-d)

และคือการเปลี่ยน :CCTC

CT=(อีผม-ชั่วโมงชั่วโมง-ผม-อีก.-dผมaผม-ก.d-adชั่วโมง-อีก.ก.-aชั่วโมงaอี-d)

และเดชอุดม(M)คือตัวกำหนดของM :

เดชอุดม(M)=a(อีผม-ชั่วโมง)-(dผม-ก.)+(dชั่วโมง-อีก.)

ตัวอย่างการทำงาน

0, -3, -2, 1, -4, -2, -3, 4, 1ตัวอย่างเช่นสมมติว่าใส่เป็น สิ่งนี้สอดคล้องกับเมทริกซ์:

M=(0-3-21-4-2-341)

ก่อนอื่นเราลองคำนวณสิ่งที่เรียกว่าดีเทอร์แนนต์โดยใช้สูตรด้านบน:

เดชอุดม(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)×-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)

จากนั้นเราต้องเปลี่ยน (พลิกแถวและคอลัมน์) เพื่อรับ :C TCCT

CT=(4-525-6-2-893)

ในที่สุดเราสามารถค้นหาสิ่งที่ตรงกันข้ามเป็น:

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

4, -5, -2, 5, -6, -2, -8, 9, 3ดังนั้นการส่งออกจะเป็น

กฎระเบียบ

  • เมทริกซ์ที่ให้มาจะมีค่าผกผันเสมอ (เช่นไม่ใช่เอกพจน์) เมทริกซ์อาจตรงกันข้ามตนเอง

  • เมทริกซ์ที่ให้จะเป็นเมทริกซ์ขนาด 3 คูณ 3 มีจำนวนเต็ม 9 ตัวเสมอ

  • ตัวเลขในอินพุตจะเป็นจำนวนเต็มเสมอในช่วง1000n1000

  • ส่วนประกอบที่ไม่ใช่จำนวนเต็มของเมทริกซ์อาจถูกกำหนดเป็นทศนิยมหรือเศษส่วน

ตัวอย่าง

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

การชนะ

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

คำตอบ:


18

MATL , 54 ไบต์

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

ลองออนไลน์!

เพียงเพื่อทำให้มันน่าสนใจอย่าใช้ฟังก์ชันการแบ่งเมทริกซ์หรือฟังก์ชันดีเทอร์มินัลเพื่อทำ

ให้คำนวณหาดีเทอร์มิแนนต์โดยใช้Rule of Sarrusแทน

การสาธิตกฎของ Sarrus

และ adjugate (ย้ายเมทริกซ์ปัจจัย) โดยใช้สูตรเคย์ลีแฮมิลตัน

adj(A)=12((TRA)2-TRA2)ผม3-ATRA+A2.

รหัสความคิดเห็น:

% 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 Online )A23:"Gt!@qYS*!s] 3$v t&v 3:K-&Xd

วิธีที่ตรงและชัดเจนมากขึ้น:

4 ไบต์

-1Y^

ลองออนไลน์!

(-1 ไบต์ขอบคุณ @Luis Mendo)

-1 - กดตัวอักษร -1

Y^ - เพิ่มอินพุตให้กับพลังงานนั้น (อินพุตโดยนัย, เอาต์พุตโดยนัย)


น่าสนใจฉันไม่เคยรู้เลยว่ามันถูกเรียกว่า "Rule of Sarrus" ครูของฉันสอนเรา แต่เขาทำมันเองในขณะที่อยู่ที่มหาวิทยาลัย
สลายตัวเบต้า

@LuisMendo ขอบคุณแทนที่รุ่นสั้น ๆ (tbh รุ่นก่อนหน้านี้เป็นเพียงการใช้งานข้อเสนอแนะของคู่มือ MATL สำหรับการผกผันโดยไม่ต้องคิดอะไรจริง ๆ เข้าไปในนั้น :)) สำหรับรุ่นยาวฉันคิดว่ามันค่อนข้างชัดเจนกว่าที่จะปล่อยให้เป็นเช่นนั้นพอที่จะคุ้มค่าที่จะตี 1 ไบต์
sundar - Reinstate Monica

1
@sundar Heh ฉันไม่จำแม้แต่คำแนะนำนั้น ฉันจะเพิ่มข้อเสนอแนะของพลังเมทริกซ์ด้วย
Luis Mendo


9

R, 51 35 27 8 5 ไบต์

solve

ลองออนไลน์!

เริ่มจากการทำสิ่งที่ท้าทายกอล์ฟครั้งแรก ขออภัยถ้าการจัดรูปแบบของฉันผิด!

บันทึกเพิ่มอีก 11 ไบต์ขอบคุณ Giuseppe! บันทึกเพิ่มอีก 19 ไบต์ด้วย JAD!


5
ยินดีต้อนรับสู่ PPCG!
Beta Decay

ลบชื่อตัวแปรพารามิเตอร์ออกจากฟังก์ชั่นเมทริกซ์ซึ่งลบออก 16 ไบต์!
Robert S.

1
ดี! คุณสามารถลบตัวแปรส่วนใหญ่เพื่อบันทึกไบต์ได้เพราะคุณเพียงแค่ผูกมัดการทำงานร่วมกัน: ลองออนไลน์!
จูเซปเป้

1
หากคุณกำลังจะใช้solveการแก้ปัญหาเป็นเพียงsolveเพราะมันตอบสนองความต้องการทั้งหมดของคำถาม มันต้องใช้เมทริกซ์เป็นอินพุตและส่งกลับเมทริกซ์
JAD


4

เยลลี่ 3 ไบต์

æ*-

ลองออนไลน์!

สมมติว่าเราสามารถนำเข้าและจัดทำรายการ 2D ของจำนวนเต็ม หากรายการจำนวนเต็มทั้งหมดจำเป็นสำหรับทั้งอินพุทและเอาท์พุทสิ่งนี้ใช้ได้ 6 ไบต์


æ*-1-1

12
ความคิดเห็นไม่ได้หมายความว่าจะต้องมีอายุยืนยาว หากคุณรวมถึงคำอธิบายในความคิดเห็นคุณควรย้ายไปที่คำตอบแทน
โผล่

4

JavaScript (ES6), 123 ไบต์

บันทึก 2 ไบต์ขอบคุณ @ Mr.Xcoder
บันทึก 1 ไบต์ขอบคุณ @ETHproductions

รับอินพุตเป็น 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

@BetaDecay JS ไม่มีเลย :-)
Arnauld

วงเล็บเหล่านี้จำเป็น
Mr. Xcoder




1

Python 3, 77 ไบต์

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

ใช้อินพุตเป็นรายการแบบเรียบ

มันคือ 63 ไบต์หากอินพุตถูกใช้เป็นอาร์เรย์ 2D:

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

Perl 5, 179 ไบต์

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}

ลองมันออนไลน์





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 ในการแปลงและฉันรู้สึกขี้เกียจที่จะทำลำดับตัวละครยาวเหล่านั้นอีกครั้งเพื่อแก้ไขในขณะนี้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.