Kofaktör Matrisleri


18

Kofaktör matrisi, Adjugate Matrix'in transpozisyonudur . Bu matrisin elemanları orijinal matrisin kofaktörleridir .

Kofaktör resim açıklamasını buraya girin(yani sıra i ve sütun j'deki kofaktör matrisinin elemanı), i. Sıra ve jth sütununun orijinal matristen (-1) ^ (i + j) ile çarpılmasıyla oluşturulan alt matrisin belirleyicisidir.

Örneğin, matris için

resim açıklamasını buraya girin

Satır 1 ve sütun 2'deki kofaktör matrisinin öğesi:

resim açıklamasını buraya girin

Bir matrisin determinantının ne olduğu ve bunları nasıl hesaplayacağınız hakkında bilgi bulabilirsiniz .

Meydan okuma

Amacınız bir giriş matrisinin kofaktör matrisini çıkarmaktır.

Not : Kofaktör matrislerini veya adjuvan matrisleri veya determinantları veya benzer şeyleri değerlendiren yerleşiklere izin verilir .

Giriş

Matris, komut satırı bağımsız değişkeni, işlev parametresi olarak STDINveya kullandığınız dil için en uygun olan herhangi bir şekilde girilebilir.

Matris, her alt liste bir satıra karşılık gelen ve soldan sağa doğru sıralanmış faktörleri içeren bir liste listesi olarak biçimlendirilecektir. Satırlar listede yukarıdan aşağıya doğru sıralanır.

Örneğin, matris

a b
c d

ile temsil edilecek [[a,b],[c,d]].

O dilinizi uyan ve mantıklı olup olmadığını (örneğin başka bir şeyle köşeli parantez ve virgül yerini alabilir ((a;b);(c;d)))

Matrisler yalnızca tamsayıları içerir (negatif olabilir) .

Matrisler her zaman kare olacaktır (yani aynı sayıda satır ve sütun).

Girişin her zaman doğru olacağını varsayabilirsiniz (yani biçimlendirme sorunu yok, tamsayılardan başka bir şey yok, boş matris yok).

Çıktı

Ortaya çıkan kofaktör matrisi çıktılanabilir STDOUT, bir işlevden döndürülebilir, bir dosyaya yazılabilir veya kullandığınız dile doğal olarak uyan benzer bir şey olabilir.

Kofaktör matrisi, giriş matrislerinin verildiği gibi biçimlendirilmelidir, örn [[d,-c],[-b,a]]. Bir dize okursanız, matrisin girişte olduğu gibi biçimlendirildiği bir dize döndürmeli / çıktı vermelisiniz. Giriş gibi bir liste listesi gibi bir şey kullanırsanız, bir liste listesi de döndürmeniz gerekir.

Test senaryoları

  • Giriş: [[1]]

Çıktı: [[1]]

  • Giriş: [[1,2],[3,4]]

Çıktı: [[4,-3],[-2,1]]

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

Çıktı: [[-8,-5,4],[18,12,-6],[-4,-1,2]]

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

Çıktı:

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

puanlama

Bu yani bayt en kısa cevap kazanır.


2
Ben kofaktör matris yorumlamak nasıl emin değilim giriş matrisleri bağımsız değişkenlerden girdi almak ve bir değer döndüren işlev gönderimleri için verilen şekilde biçimlendirilmelidir . Gerçek matrisleri veya karakter dizisi temsillerini okur / iade eder miyiz?
Dennis

1
Kısacası: bir dize okursanız, matrisin girişte olduğu gibi biçimlendirildiği bir dize döndürmeli / çıktı vermelisiniz. Örneğin bir liste listesi gibi bir şey kullanırsanız, bir liste listesi de döndürmeniz gerekir.
15'te

1x1 matrisin gerçekten bir kofaktör matrisi var mı?
Liam

Ayrıca, sondan bir önceki test durumunuz, yanılmıyorsam, adjuvan matris (ne olması gerektiğinin dönüşümü) gibi görünüyor.
Liam

@ICanHazHats Doğru, düzelttim, teşekkürler.
15'te

Yanıtlar:


1

J, 29 bayt

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

Aynı epsilon / ters / determinant hile. Sağdan sola doğru:

  • 1e_9+ bir epsilon ekler,
  • (-/ .**%.)olan belirleyici ( -/ .*) kez ters ( %.,)
  • |: aktaran,
  • <.0.5+ mermi.

5

Matlab, 42 33 bayt

Anonim bir işlev kullanma:

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

Giriş ve çıkış matrislerdir (2B sayısal diziler).

epsmatrisin tekil olması durumunda eklenir. Kullanılarak "kaldırılır" round(gerçek sonucun bir tamsayı olacağı garanti edilir).

Misal:

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

Tekil matris ile örnek:

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

Veya Octave'de çevrimiçi deneyin .


2
Ancak, bu konuda bahsetmediğim bir endişem var: bu cevap giriş matrisinin ters çevrilebilir olduğunu varsayar. Kod üzerinde say kullanıldığında [1,0 ; 0,0], çıktı alması gerektiğinde bir hata [0,0 ; 0,1]
oluşuyor

1
Bir işlevden döndüğünüz için, ihtiyacınız olduğunu düşünmüyorum mat2str: "ortaya çıkan kofaktör matrisi ... bir işlevden döndürülebilir"
FryAmTheEggman

1
@FryAmTheEggman Teşekkürler! Ancak " Kofaktör matrisi, giriş matrislerinin verildiği gibi biçimlendirilmelidir ". Bu yüzden ihtiyacım olduğunu düşünüyorummat2str
Luis Mendo

1
@Fatalize Evet, işte bu. epsyaklaşık 1e-16'dır. Böylece matrisi tekil olmayan (ama çok kötü şartlandırılmış) yapar. Sonuç tam olarak tamsayı değildir; böylece fix(sıfıra doğru yuvarlayın) bunu düzeltir. Hatanın aşılmaması durumunda bu çalışır .5. Korkarım garanti yok. Çok büyük tamsayılar için başarısız olabilir. Kirli bir numara olduğunu söyledim :-P
Luis Mendo

1
@ Açıklık için hazırlayın, mat2strburada gerekli olup olmadığını söyleyebilir misiniz ? Bana göre bu bir işlev olduğu için, girdi aslında biçimlendirilmemiş matristir. Eğer denerseniz f=...o zaman f(f(...))bu işe yaramaz, ancak kaldırmak mat2strbu işe yaramasını sağlar.
FryAmTheEggman

4

Mathematica, 27 35 bayt

Thread[Det[#+x]Inverse[#+x]]/.x->0&

Bu, ters çevrilemez matrisler için çalışıyor mu, örn [[1,0],[0,0]].
15'te

@FryAmTheEggman Bu işe yaramıyor gibi görünüyor.
LegionMammal978

3

R, 121 94 bayt

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

Bu, bir sınıf nesnesini kabul eden matrixve böyle bir nesneyi döndüren saçma bir işlevdir . Bunu çağırmak için bir değişkene atayın.

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 baytmapply yerine kullanıyor outerveVectorize
Giuseppe

2

GAP , 246 Bayt

Bunun, iç içe üçlü döngülerle iyi kodlama olduğunu söyleyebilirsiniz.

Oldukça basit. GAP, diğer matematik odaklı dillerin yaptığı matrislerle başa çıkmak için gerçekten aynı araçlara sahip değildir. Burada gerçekten kullanılan tek şey yerleşik belirleyici operatördür.

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

Verbosity v2 , 196 bayt

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

Çevrimiçi deneyin!

NB: Şu anda TIO üzerinde çalışmıyor ve çekilmeyi bekliyor. Çevrimdışı çalışmalı

((a b)(c d))Temsil etmek için formdaki girdiyi alır

[birbcd]

Adugate için bir yerleşik olmasına rağmen, Verbosity'nin ayrıntı düzeyi hala onu sakatlıyor. Oldukça basit nasıl çalışır, sadece girdinin adjuvanını aktarır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.