Кофакторные матрицы


18

Матрица кофактора - это транспонированная матрица адъютатов . Элементы этой матрицы являются кофакторами исходной матрицы.

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

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

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

Элемент матрицы кофактора в строке 1 и столбце 2:

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

Вы можете найти информацию о том, что определитель матрицы и как их рассчитать, здесь .

Вызов

Ваша цель - вывести матрицу кофактора входной матрицы.

Примечание : Встроенные модули, оценки матриц кофактора или adjugate матрицы, или детерминанты или что - нибудь подобное будут разрешены .

вход

Матрица может быть введена как аргумент командной строки, как параметр функции, 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

Matlab, 42 33 байта

Использование анонимной функции:

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

Вход и выход - матрицы (двумерные числовые массивы).

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
Однако у меня есть проблема, о которой я не говорил в этом задании: этот ответ предполагает, что входная матрица обратима. Использование кода на скажем [1,0 ; 0,0]дает ошибку, когда он должен выводить[0,0 ; 0,1]
Fatalize

1
Поскольку вы возвращаетесь из функции, я не думаю, что вам нужно mat2str: «полученная матрица кофактора может быть ... возвращена из функции»
FryAmTheEggman

1
@FryAmTheEggman Спасибо! Но « Матрица кофактора должна быть отформатирована точно так же, как заданы входные матрицы ». Вот почему я думаю, что мне нужноmat2str
Луис Мендо

1
@Fatalize Да, это так. epsсоставляет около 1e-16. Так что это делает матрицу неособой (но очень плохо обусловленной). Результат не совсем целое число; так fix(вокруг нуля) исправляет это. Это работает, если ошибка не превышает .5. Боюсь, нет никаких гарантий. Для очень больших целых чисел это может потерпеть неудачу. Я сказал , что это был грязный трюк :-P
Луис Mendo

1
@ Фатализировать для ясности, не могли бы вы сказать, 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и возвращает другой такой объект. Чтобы вызвать его, присвойте его переменной.

Ungolfed:

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
Giuseppe

2

GAP , 246 байт

Вы можете сказать, что это хорошее кодирование с помощью тройных вложенных циклов for.

Это довольно просто. 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;

ungolfed:

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

Многословие 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))для представления

[aбсd]

Несмотря на наличие встроенного для адъюгата, многословие многословия все еще наносит вред его. Довольно просто, как это работает, просто транспонирует адъюгат ввода.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.