Matriks kofaktor

18

Matriks kofaktor adalah transpose dari Matriks Adjugate . Elemen-elemen dari matriks ini adalah kofaktor dari matriks asli.

Kofaktor masukkan deskripsi gambar di sini(yaitu elemen matriks kofaktor pada baris i dan kolom j) adalah penentu dari submatrix yang dibentuk dengan menghapus baris ke-i dan kolom ke-j dari matriks asli, dikalikan dengan (-1) ^ (i + j).

Misalnya, untuk matriks

masukkan deskripsi gambar di sini

Elemen matriks kofaktor pada baris 1 dan kolom 2 adalah:

masukkan deskripsi gambar di sini

Anda dapat menemukan info tentang apa yang menentukan matriks dan bagaimana menghitungnya di sini .

Tantangan

Tujuan Anda adalah untuk mengeluarkan matriks kofaktor dari matriks input.

Catatan : Built-in yang mengevaluasi matriks kofaktor, atau matriks tambahan, atau penentu atau hal serupa yang diizinkan .

Memasukkan

Matriks dapat dimasukkan sebagai argumen baris perintah, sebagai parameter fungsi, dalam STDINatau dengan cara apa pun yang paling sesuai untuk bahasa yang Anda gunakan.

Matriks akan diformat sebagai daftar daftar, masing-masing sublist sesuai dengan satu baris, yang berisi faktor-faktor yang dipesan dari kiri ke kanan. Baris dipesan dari atas ke bawah dalam daftar.

Misalnya, matriks

a b
c d

akan diwakili oleh [[a,b],[c,d]].

Anda dapat mengganti tanda kurung siku dan koma dengan sesuatu yang lain jika cocok dengan bahasa Anda dan masuk akal (misalnya ((a;b);(c;d)))

Matriks hanya akan berisi bilangan bulat (yang bisa negatif) .

Matriks akan selalu berbentuk bujur sangkar (yaitu jumlah baris dan kolom yang sama).

Anda dapat mengasumsikan bahwa input akan selalu benar (yaitu tidak ada masalah format, tidak lain dari integer, tidak ada matriks kosong).

Keluaran

Matriks kofaktor yang dihasilkan dapat di-output ke STDOUT, dikembalikan dari fungsi, ditulis ke file, atau hal serupa lainnya yang secara alami sesuai dengan bahasa yang Anda gunakan.

Matriks kofaktor harus diformat dengan cara yang persis sama dengan matriks input yang diberikan, misalnya [[d,-c],[-b,a]]. Jika Anda membaca sebuah string, maka Anda harus mengembalikan / menampilkan string di mana matriks diformat persis seperti pada input. Jika Anda menggunakan sesuatu seperti misalnya daftar daftar sebagai input, maka Anda harus mengembalikan daftar daftar juga.

Uji kasus

  • Memasukkan: [[1]]

Keluaran: [[1]]

  • Memasukkan: [[1,2],[3,4]]

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

  • Memasukkan: [[-3,2,-5],[-1,0,-2],[3,-4,1]]

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

  • Memasukkan: [[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]]

Keluaran:

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

Mencetak gol

Ini adalah sehingga jawaban tersingkat dalam byte menang.

Fatalisasi
sumber
2
Saya tidak yakin bagaimana menafsirkan matriks kofaktor harus diformat dengan cara yang sama persis dengan matriks input yang diberikan untuk pengiriman fungsi yang mendapatkan input dari argumen dan mengembalikan nilai. Apakah kita membaca / mengembalikan matriks aktual atau representasi string mereka?
Dennis
1
Singkatnya: jika Anda membaca sebuah string, maka Anda harus mengembalikan / menampilkan string di mana matriks diformat persis seperti pada input. Jika Anda menggunakan sesuatu seperti misalnya daftar daftar, maka Anda harus mengembalikan daftar daftar juga.
Fatalkan
Apakah matriks 1x1 benar-benar memiliki matriks kofaktor?
Liam
Juga test case kedua dari belakang Anda tampaknya merupakan adjugate matrix (transpose dari apa yang seharusnya), kecuali saya salah.
Liam
@ICanHazHats Benar, saya memperbaikinya, terima kasih.
Fatalkan

Jawaban:

1

J, 29 byte

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

Trik epsilon / invers / determinan yang sama. Dari kanan ke kiri:

  • 1e_9+ menambahkan epsilon,
  • (-/ .**%.)adalah determinan ( -/ .*) kali terbalik ( %.),
  • |: transposes,
  • <.0.5+ putaran.
Lynn
sumber
5

Matlab, 42 33 byte

Menggunakan fungsi anonim:

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

Input dan output adalah matriks (array numerik 2D).

epsditambahkan jika matriksnya tunggal. Itu "dihapus" menggunakan round(hasil sebenarnya dijamin menjadi bilangan bulat).

Contoh:

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

Contoh dengan matriks singular:

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

Atau coba online di Octave.

Luis Mendo
sumber
2
Namun saya memiliki kekhawatiran yang belum saya bicarakan dalam tantangan: jawaban ini mengasumsikan bahwa matriks input tidak dapat dibalik. Menggunakan kode Anda pada katakanlah [1,0 ; 0,0]memberikan kesalahan ketika harus menampilkan[0,0 ; 0,1]
Fatalize
1
Karena Anda kembali dari suatu fungsi, saya rasa Anda tidak perlu mat2str: "matriks kofaktor yang dihasilkan mungkin ... dikembalikan dari suatu fungsi"
FryAmTheEggman
1
@FryAmTheEggman Terima kasih! Tetapi " Matriks kofaktor harus diformat dengan cara yang sama persis dengan matriks input yang diberikan ". Itu sebabnya saya pikir saya perlumat2str
Luis Mendo
1
@Fatalize Ya, hanya itu. epssekitar 1e-16. Jadi itu membuat matriks non-singular (tapi sangat buruk). Hasilnya tidak persis bilangan bulat; jadi fix(bulat menuju nol) memperbaikinya. Ini berfungsi asalkan kesalahan tidak melebihi .5. Saya khawatir tidak ada jaminan. Untuk bilangan bulat yang sangat besar mungkin gagal. Saya mengatakan itu adalah trik kotor :-P
Luis Mendo
1
@Fatalize untuk kejelasan, dapatkah Anda mengatakan apakah mat2strdiperlukan di sini? Bagi saya rasanya karena ini adalah fungsi, input sebenarnya adalah matriks yang tidak diformat. Seperti jika Anda mencoba f=...maka lakukan f(f(...))ini tidak akan berhasil, tetapi menghapus mat2strmembuatnya bekerja dengan baik.
FryAmTheEggman
4

Mathematica, 27 35 byte

Thread[Det[#+x]Inverse[#+x]]/.x->0&
alephalpha
sumber
Apakah ini berfungsi untuk matriks yang tidak dapat dibalik, misalnya [[1,0],[0,0]]?
Fatalkan
@FryAmTheEggman Sepertinya tidak berhasil.
LegionMammal978
3

R, 121 94 byte

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

Ini adalah fungsi yang sangat panjang yang menerima objek kelas matrixdan mengembalikan objek lain tersebut. Untuk menyebutnya, tetapkan ke variabel.

Tidak Terkumpul:

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)
}
Alex A.
sumber
80 byte menggunakan mapplybukan outerdanVectorize
Giuseppe
2

GAP , 246 Bytes

Anda dapat mengatakan ini adalah pengkodean yang bagus dengan triple-nested for-loop.

Cukup mudah. GAP tidak benar-benar memiliki alat yang sama untuk menangani matriks yang dilakukan oleh bahasa berorientasi matematika lainnya. Satu-satunya hal yang benar-benar digunakan di sini adalah operator dalam determinan.

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;
Liam
sumber
1

Verbosity v2 , 196 byte

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

Cobalah online!

NB: Saat ini tidak bekerja pada TIO, menunggu tarikan. Harus bekerja offline

Mengambil input dalam formulir ((a b)(c d))untuk diwakili

[Sebuahbcd]

Meskipun memiliki builtin untuk adjugate, verbositas Verbosity masih melumpuhkannya. Cara kerjanya cukup mendasar, cukup transposisi adjugate dari input.

caird coinheringaahing
sumber