Matryce Współczynnika


18

Matryca kofaktora jest transpozycją macierzy adiuwatu . Elementy tej matrycy są kofaktorami oryginalnej matrycy.

Kofaktor wprowadź opis zdjęcia tutaj(tj. Element macierzy kofaktora w rzędzie i i kolumnie j) jest wyznacznikiem submatrix utworzonej przez usunięcie i-tego rzędu i j-tej kolumny z oryginalnej macierzy, pomnożonej przez (-1) ^ (i + j).

Na przykład dla matrycy

wprowadź opis zdjęcia tutaj

Element macierzy kofaktora w wierszu 1 i kolumnie 2 to:

wprowadź opis zdjęcia tutaj

Informacje na temat wyznacznika macierzy i sposobu ich obliczania można znaleźć tutaj .

Wyzwanie

Twoim celem jest wyprowadzenie macierzy kofaktora macierzy wejściowej.

Uwaga : Dozwolone są wbudowane, które oceniają matryce kofaktorów lub macierze przyległe, wyznaczniki lub cokolwiek podobnego .

Wejście

Macierz może być wprowadzona jako argument wiersza poleceń, jako parametr funkcji, STDINw dowolny sposób lub w sposób najbardziej odpowiedni dla używanego języka.

Macierz zostanie sformatowana jako lista list, a każda lista podrzędna odpowiada jednemu wierszowi, który zawiera czynniki uporządkowane od lewej do prawej. Rzędy są uporządkowane od góry do dołu na liście.

Na przykład macierz

a b
c d

będzie reprezentowany przez [[a,b],[c,d]].

Możesz zamienić nawiasy kwadratowe i przecinki na coś innego, jeśli pasuje do twojego języka i jest sensowny (np. ((a;b);(c;d)))

Macierze będą zawierać tylko liczby całkowite (które mogą być ujemne) .

Macierze zawsze będą kwadratowe (tj. Ta sama liczba wierszy i kolumn).

Możesz założyć, że dane wejściowe zawsze będą poprawne (tj. Nie będzie problemu z formatowaniem, nic poza liczbami całkowitymi, brak pustej macierzy).

Wynik

Otrzymana macierz kofaktora może zostać wyprowadzona STDOUT, zwrócona z funkcji, zapisana do pliku lub w dowolny podobny sposób, który naturalnie pasuje do używanego języka.

Macierz kofaktora należy sformatować dokładnie w taki sam sposób, jak podane są macierze wejściowe, np [[d,-c],[-b,a]]. Jeśli czytasz ciąg, musisz zwrócić / wyprowadzić ciąg, w którym macierz jest sformatowana dokładnie tak, jak na wejściu. Jeśli używasz czegoś takiego jak np. Lista list jako danych wejściowych, musisz również zwrócić listę list.

Przypadki testowe

  • Wejście: [[1]]

Wynik: [[1]]

  • Wejście: [[1,2],[3,4]]

Wynik: [[4,-3],[-2,1]]

  • Wejście: [[-3,2,-5],[-1,0,-2],[3,-4,1]]

Wynik: [[-8,-5,4],[18,12,-6],[-4,-1,2]]

  • Wejście: [[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]]

Wynik:

[[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]]

Punktacja

To jest więc wygrywa najkrótsza odpowiedź w bajtach.


2
Nie jestem pewien, jak interpretować matrycę kofaktora należy sformatować dokładnie w ten sam sposób, w jaki podane są macierze wejściowe dla funkcji wysyłających dane z argumentów i zwracających wartość. Czy odczytujemy / zwracamy rzeczywiste macierze lub ich ciągi znaków?
Dennis,

1
W skrócie: jeśli czytasz ciąg, musisz zwrócić / wyprowadzić ciąg, w którym macierz jest sformatowana dokładnie tak, jak na wejściu. Jeśli używasz czegoś takiego jak np. Lista list, musisz również zwrócić listę list.
Fatalize

Czy matryca 1x1 naprawdę ma matrycę kofaktora?
Liam,

Również twój przedostatni przypadek testowy wydaje się być macierzą przylegającą (transpozycją tego, co powinno być), chyba że się mylę.
Liam,

@ICanHazHats Prawidłowo, naprawiłem to, dzięki.
Fatalize

Odpowiedzi:


1

J, 29 bajtów

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

Ta sama sztuczka epsilon / inverse / determinant. Z prawej do lewej:

  • 1e_9+ dodaje epsilon,
  • (-/ .**%.)jest wyznacznikiem ( -/ .*) razy inverse ( %.),
  • |: transponuje,
  • <.0.5+ rundy.

5

Matlab, 42 33 bajty

Korzystanie z anonimowej funkcji:

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

Dane wejściowe i wyjściowe są macierzami (tablice numeryczne 2D).

epsjest dodawany w przypadku, gdy macierz jest pojedyncza. Jest „usuwany” za pomocą round(z pewnością prawdziwy wynik jest liczbą całkowitą).

Przykład:

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

Przykład z macierzą pojedynczą:

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

Lub wypróbuj online w Octave.


2
Mam jednak obawy, o których nie mówiłem w tym wyzwaniu: ta odpowiedź zakłada, że ​​macierz wejściowa jest odwracalna. Użycie kodu na say [1,0 ; 0,0]daje błąd, kiedy powinien zostać wyświetlony[0,0 ; 0,1]
Fatalize

1
Ponieważ wracasz z funkcji, nie sądzę, że powinieneś potrzebować mat2str: „wynikowa macierz kofaktora może być… zwrócona z funkcji”
FryAmTheEggman,

1
@FryAmTheEggman Thanks! Ale „ Macierz kofaktora musi być sformatowana dokładnie w taki sam sposób, jak podane są macierze wejściowe ”. Dlatego myślę, że potrzebujęmat2str
Luis Mendo,

1
@Fatalize Tak, to jest to. epswynosi około 1e-16. To sprawia, że ​​matryca nie jest pojedyncza (ale bardzo źle uwarunkowana). Wynik nie jest dokładnie liczbą całkowitą; więc fix(zaokrąglenie do zera) naprawia to. Działa to pod warunkiem, że błąd nie przekracza .5. Obawiam się, że nie ma żadnych gwarancji. W przypadku bardzo dużych liczb całkowitych może się nie powieść. Powiedziałem, że to brudna sztuczka :-P
Luis Mendo

1
@Ugratuj dla jasności, czy możesz powiedzieć, czy mat2strjest tu potrzebna? Wydaje mi się, że skoro jest to funkcja, to tak naprawdę dane wejściowe to niesformatowana macierz. Na przykład, jeśli spróbujesz f=..., f(f(...))to nie zadziała, ale usunięcie mat2strpowoduje, że działa dobrze.
FryAmTheEggman


3

R, 121 94 bajtów

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

Jest to absurdalnie długa funkcja, która przyjmuje obiekt klasy matrixi zwraca inny taki obiekt. Aby go wywołać, przypisz go do zmiennej.

Nie golfowany:

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 bajtów używając mapplyzamiast outeriVectorize
Giuseppe

2

GAP , 246 bajtów

Możesz powiedzieć, że jest to dobre kodowanie dzięki potrójnie zagnieżdżonym pętlom for.

To całkiem proste. GAP nie ma tak naprawdę takich samych narzędzi do radzenia sobie z macierzami, jakie mają inne języki zorientowane na matematykę. Jedyne, co tak naprawdę tutaj zastosowano, to wbudowany operator wyznacznika.

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;

bez golfa:

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 bajtów

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

Wypróbuj online!

Uwaga: obecnie nie działa w TIO, oczekuje na ściągnięcie. Powinien działać w trybie offline

Pobiera dane wejściowe w formularzu ((a b)(c d))do przedstawienia

[zabdore]

Pomimo posiadania wbudowanej funkcji dla jednostki zależnej, gadatliwość wciąż ją osłabia. Dość podstawowe, jak to działa, po prostu transponuje odpowiednik wejścia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.