コファクター行列


18

補因子行列は、Adjugate Matrixの転置です。この行列の要素は、元の行列の補因子です。

補因子ここに画像の説明を入力してください(つまり、行iおよび列jの補因子行列の要素)は、元の行列からi番目の行とj番目の列を削除して形成される部分行列の行列式で、(-1)^(i + j)を掛けます。

たとえば、行列の場合

ここに画像の説明を入力してください

行1および列2の補因子行列の要素は次のとおりです。

ここに画像の説明を入力してください

ここで、行列の行列式とその計算方法に関する情報を見つけることができます。

チャレンジ

あなたの目標は、入力行列の補因子行列を出力することです。

:補因子行列、または補助行列、行列式、または同様のものを評価する組み込み関数が許可されます。

入力

マトリックスは、コマンドライン引数、関数パラメーター、STDINまたは使用する言語に最適な方法で入力できます。

マトリックスはリストのリストとしてフォーマットされ、各サブリストは1行に対応し、左から右に順序付けられた因子を含みます。行はリストの一番上から下の順に並べられます。

たとえば、行列

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
つまり、文字列を読み取る場合は、入力とまったく同じようにマトリックスがフォーマットされた文字列を返す/出力する必要があります。リストのリストなどを使用する場合は、リストのリストも返す必要があります。
15

1x1行列には実際に補因子行列がありますか?
リアム

また、最後から2番目のテストケースは、私が間違っていない限り、アジュバントマトリックス(あるべきものの転置)のようです。
リアム

@ICanHazHats正解、修正しました、ありがとう。
15

回答:


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))

入力と出力は行列(2D数値配列)です。

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
ルイスメンドー

1
わかりやすくするために@Fatalize 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別のそのようなオブジェクトを返す、とてつもなく長い関数です。呼び出すには、変数に割り当てます。

ゴルフをしていない:

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)
}

andのmapply代わりに80バイトを使用outerVectorize
ジュゼッペ

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;

なし:

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>

オンラインでお試しください!

注意:現在、TIOでは動作せず、プルを待機しています。オフラインで動作するはずです

フォーム((a b)(c d))を入力して表現します

[abcd]

審判員のためのビルトインを持っているにもかかわらず、Verbosityの冗長性はそれを不自由にします。動作の基本はかなり基本的で、入力のアジュゲートを入れ替えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.