Знайдіть зворотну матрицю 3 на 3


22

Виклик

Дано дев'ять чисел, a, b, c, d, e, f, g, h, iяк вхідні дані, які відповідають квадратній матриці:

М=(абcгеfггодi)

Знайдіть обернену матрицю, М-1 та виведіть її компоненти.

Зворотна матриця

Обернена матриця 3 на 3 підкоряється такому рівнянню:

MM1=M1M=I=(100010001)

І може бути обчислена як:

M1=1det(M)CT

Де - матриця коефіцієнтів:C

C=(eifhfgdidhegchbiaicgbgahbfcecdafaebd)

І - це перенесення :CCТC

CT=(eifhchbibfcefgdiaicgcdafdhegbgahaebd)

І є визначником :Mdet(M)M

det(М)=а(еi-fгод)-б(гi-fг)+c(ггод-ег)

Приклад роботи

Наприклад, скажімо, вхід є 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

Далі давайте обчислимо матрицю коефіцієнтів:

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

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

Потім нам потрібно перенести (гортати рядки та стовпці), щоб отримати :C TССТ

СТ=(4-525-6-2-893)

Нарешті, ми можемо знайти зворотне як:

М-1=1det(М)СТ=11(4-525-6-2-893)=(4-525-6-2-893)

Тож вихід був би 4, -5, -2, 5, -6, -2, -8, 9, 3.

Правила

  • Дана матриця завжди матиме обернений (тобто несинулярний). Матриця може бути самооберненою

  • Дана матриця завжди буде матрицею 3 на 3 з 9 цілими числами

  • Числа на вході завжди будуть цілими числами в діапазоні-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

Перемога

Виграє найкоротший код у байтах.

Відповіді:


18

MATL , 54 байти

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

Спробуйте в Інтернеті!

Для того, щоб це було цікаво, не використовуйте вбудований матричний поділ чи визначальні функції для цього.

Натомість обчислює визначник, використовуючи Правило Саррус .

Правило демонстрації Саррус

І ад'югат (транспонована кофакторна матриця) за формулою Кейлі – Гамільтона .

прикл(А)=12((трА)2-трА2)Я3-АтрА+А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*А23:"Gt!@qYS*!s] 3$v t&v 3:K-&Xd

Більш прямий і очевидний спосіб:

4 байти

-1Y^

Спробуйте в Інтернеті!

(-1 байт завдяки @Luis Mendo.)

-1 - Просуньте буквальне -1

Y^ - Підвищити вхід до цієї потужності (неявний вхід, неявний вихід)


Цікаво, що я ніколи не знав, що його називають «Правилом Саррус». Мій учитель навчав нас цього, але він склав це сам, перебуваючи в університеті.
Бета-розпад

@LuisMendo Спасибі, замінила коротку версію (tbh попередня версія була лише сліпою реалізацією пропозиції посібника MATL щодо зворотного, в цьому не було думок :)). Для довгої версії я думаю, що це трохи крихітніше, щоб залишити її як таку, достатньо, щоб варто було скористатись 1-байтним хітом.
sundar

1
@sundar Heh, я навіть не пам’ятав цієї пропозиції. Я додам пропозицію про потужність матриці
Луїс Мендо


9

R, 51 35 27 8 5 байт

solve

Спробуйте в Інтернеті!

Спочатку займіться виконанням однієї з таких проблем із гольфом. Вибачте, якщо моє форматування неправильне!

Збережено додаткові 11 байт завдяки Джузеппе! Збережено додаткові 19 байт завдяки JAD!


5
Ласкаво просимо до PPCG!
Бета-розпад

Вилучено імена змінних параметрів з функції матриці, яка віднімала 16 байт!
Роберт С.

1
Приємно! Ви можете видалити більшість змінних, щоб зберегти байти, оскільки ви дійсно просто з'єднуєте операції разом: спробуйте це в Інтернеті!
Джузеппе

1
Якщо ви збираєтесь використовувати solve, рішення є справедливим solve, оскільки воно відповідає всім вимогам питання. Він приймає матрицю як вхідний і повертає матрицю.
JAD


4

Желе , 3 байти

æ*-

Спробуйте в Інтернеті!

Якщо припустити, що ми можемо взяти введення та подати у вигляді двовимірного списку цілих чисел. Якщо плоский список цілих чисел дійсно потрібен і для введення, і для виводу, тоді це працює на 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 є якийсь
бета-розпад

@BetaDecay JS не має жодного. :-)
Арнольд





1

Python 3, 77 байт

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

Вводиться як плоский список.

Це 63 байти, якщо вхід береться як двовимірний масив:

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






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 на транспони, і мені лінь повторювати ці довгі послідовності символів, щоб виправити це на даний момент.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.