Кофакторні матриці


18

Кофакторна матриця - це транспозиція матриці ад'югата . Елементи цієї матриці є кофакторами вихідної матриці.

Кофактор введіть тут опис зображення (тобто елемент матриці кофактора в рядку i та стовпчику j) є визначальним фактором підматриці, утвореної шляхом видалення i-го рядка та j-го стовпця з вихідної матриці, помноженої на (-1) ^ (i + j).

Наприклад, для матриці

введіть тут опис зображення

Елементом матриці кофактора в рядку 1 і стовпці 2 є:

введіть тут опис зображення

Ви можете знайти інформацію про те, що таке визначник матриці та як їх обчислити тут .

Виклик

Ваша мета - вивести кофакторну матрицю вхідної матриці.

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

Вхідні дані

Матриця може бути введена як аргумент командного рядка, як параметр функції в STDIN або будь-яким способом, найбільш відповідним для мови, якою ви користуєтесь.

Матриця буде відформатована у вигляді списку списків, кожен підпис має відповідати одному рядку, який містить фактори, упорядковані зліва направо. Рядки впорядковані зверху вниз у списку.

Наприклад, матриця

a b
c d

буде представлений [[a,b],[c,d]] .

Ви можете замінити квадратні дужки та коми чимось іншим, якщо він відповідає вашій мові та є розумним (наприклад, ((a;b);(c;d)) )

Матриці містять лише цілі числа (які можуть бути негативними) .

Матриці завжди будуть квадратними (тобто однакова кількість рядків і стовпців).

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

Вихідні дані

Отриману матрицю кофактора можна замінити на STDOUT , повернута з функції, записана у файл або щось подібне, що природно відповідає мові, яку ви використовуєте.

Матриця кофактора повинна бути відформатована точно так само, як задані вхідні матриці, наприклад [[d,-c],[-b,a]]. Якщо ви читаєте рядок, ви повинні повернути / вивести рядок, у якій матриця відформатована точно так само, як у введенні. Якщо ви використовуєте щось на зразок списку списків у якості вхідних даних, ви також повинні повернути список списків.

Тестові справи

  • Вхід: [[1]]

Вихід: [[1]]

  • Вхід: [[1,2],[3,4]]

Вихід: [[4,-3],[-2,1]]

  • Вхід: [[-3,2,-5],[-1,0,-2],[3,-4,1]]

Вихід: [[-8,-5,4],[18,12,-6],[-4,-1,2]]

  • Вхід: [[3,-2,7,5,0],[1,-1,42,12,-10],[7,7,7,7,7],[1,2,3,4,5],[-3,14,-1,5,-9]]

Вихід:

[[9044,-13580,-9709,23982,-9737],[-1981,1330,3689,-3444,406],[14727,7113,2715,-9792,414],[-28448,-2674,-707,16989,14840],[-2149,2569,-2380,5649,-3689]]

Оцінка балів

Це тому найкоротша відповідь у байтах виграє.


2
Я не впевнений, як інтерпретувати матрицю кофактора, слід відформатувати точно так само, як вводяться матриці вводу для подання функцій, які отримують введення з аргументів і повертають значення. Чи читаємо / повертаємо фактичні матриці або їх рядкові подання?
Денніс

1
Якщо коротко: якщо ви читаєте рядок, ви повинні повернути / вивести рядок, у якій матриця відформатована точно так само, як у введенні. Якщо ви використовуєте щось на зразок списку списків, вам також потрібно повернути список.
Фаталізувати

Чи дійсно матриця 1x1 має матрицю кофактора?
Ліам

Крім того, ваш передостанній тестовий випадок, здається, є корекційною матрицею (перенесення того, яким він повинен бути), якщо я не помиляюся.
Ліам

@ICanHazHats Правильно, я виправив це, дякую.
Фаталізувати

Відповіді:


1

J, 29 байт

3 :'<.0.5+|:(-/ .**%.)1e_9+y'

Той же епсилон / зворотний / визначальний трюк. Справа наліво:

  • 1e_9+ додає епсилон,
  • (-/ .**%.)є визначальним ( -/ .*) часом, оберненим ( %.),
  • |: транспортує,
  • <.0.5+ турів.

5

Матлаб, 42 33 байт

Використання анонімної функції:

@(A)round(inv(A+eps)'*det(A+eps))

Вхід і вихід - це матриці (2D числові масиви).

epsдодається у випадку, якщо матриця є сингулярною. Він "видаляється" за допомогоюround (справжній результат гарантується як ціле число).

Приклад:

>> @(A)round(inv(A+eps)'*det(A+eps))
ans = 
    @(A)round(inv(A+eps)'*det(A+eps))
>> ans([-3,2,-5; -1,0,-2; 3,-4,1])
ans =
-8    -5     4
18    12    -6
-4    -1     2

Приклад із сингулярною матрицею:

>> @(A)round(inv(A+eps)'*det(A+eps))
ans = 
    @(A)round(inv(A+eps)*det(A+eps)')
>> ans([1,0 ; 0,0])
ans =
     0     0
     0     1

Або спробуйте в Інтернеті в Octave.


2
Однак у мене є стурбованість, про яку я не говорив у виклику: ця відповідь передбачає, що вхідна матриця є незворотною. Використання коду у режимі say припускає [1,0 ; 0,0]помилку, коли він повинен виводити[0,0 ; 0,1]
Fatalize

1
Оскільки ви повертаєтесь з функції, я не думаю, що вам знадобиться mat2str: "результуюча матриця кофактора може бути ... повернена з функції"
FryAmTheEggman

1
@FryAmTheEggman Дякую! Але " матриця кофактора повинна бути відформатована точно так само, як задані вхідні матриці ". Ось чому я думаю, що мені потрібноmat2str
Луїс Мендо

1
@Fatalize Так, це все. epsстановить близько 1е-16. Тож це робить матрицю несинулярною (але дуже погано обумовленою). Результат не зовсім цілий; так fix(круглий до нуля) це фіксує. Це працює за умови, що помилка не перевищує .5. Боюся, немає гарантій. Для дуже великих цілих чисел це може вийти з ладу. Я сказав, що це брудна хитрість :-P
Луїс Мендо

1
@Fatalize для наочності, ви можете сказати, чи mat2strпотрібно тут? Мені здається, що це функція, а вхід насправді - неформатована матриця. Як якщо ви спробуєте, f=...то зробити f(f(...))це не вийде, але видалення mat2strробить це добре.
FryAmTheEggman


3

R, 121 94 байт

function(A)t(outer(1:(n=NROW(A)),1:n,Vectorize(function(i,j)(-1)^(i+j)*det(A[-i,-j,drop=F]))))

Це абсурдно довга функція, яка приймає об’єкт класу matrix і повертає інший такий об’єкт. Щоб викликати його, призначте його змінній.

Безголівки:

cofactor <- function(A) {
    # Get the number of rows (and columns, since A is guaranteed to
    # be square) of the input matrix A
    n <- NROW(A)

    # Define a function that accepts two indices i,j and returns the
    # i,j cofactor
    C <- function(i, j) {
        # Since R loves to drop things into lower dimensions whenever
        # possible, ensure that the minor obtained by column deletion
        # is still a matrix object by adding the drop = FALSE option
        a <- A[-i, -j, drop = FALSE]

        (-1)^(i+j) * det(a)
    }

    # Obtain the adjugate matrix by vectorizing the function C over
    # the indices of A
    adj <- outer(1:n, 1:n, Vectorize(C))

    # Transpose to obtain the cofactor matrix
    t(adj)
}

80 байт з використанням mapplyзамість outerіVectorize
Джузеппе

2

GAP , 246 байт

Ви можете сказати, що це добре кодування за допомогою потрійних вкладених циклів.

Це досить просто. GAP насправді не має тих же інструментів для роботи з матрицями, що й інші мови, орієнтовані на математику. Єдине, що тут реально використовується - це вбудований оператор-визначальник.

f:=function(M)local A,B,i,j,v;A:=StructuralCopy(M);if not Size(M)=1 then for i in [1..Size(M)] do for j in [1..Size(M)] do B:=StructuralCopy(M);for v in B do Remove(v,j);od;Remove(B,i);A[i][j]:= (-1)^(i+j)*DeterminantMat(B);od;od;fi;Print(A);end;

неозорений:

f:=function(M)
    local A,B,i,j,v;
    A:=StructuralCopy(M);
    if not Size(M)=1 then
        for i in [1..Size(M)] do
            for j in [1..Size(M)] do
                B:=StructuralCopy(M);
                for v in B do
                    Remove(v,j);
                od;
                Remove(B,i);
                 A[i][j]:= (-1)^(i+j)*DeterminantMat(B);
            od;
        od;
    fi;
    Print(A);
end;

1

Verbosity v2 , 196 байт

IncludeTypePackage<Matrix>
IncludeTypePackage<OutputSystem>
print=OutputSystem:NewOutput<DEFAULT>
input=Matrix:Adjugate<ARGV0>
input=Matrix:Transpose<input>
OutputSystem:DisplayAsText<print;input>

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

NB: Наразі не працює в TIO, очікуючи на витяг. Має працювати в автономному режимі

Бере введення у формі ((a b)(c d))для подання

[абcг]

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

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