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.