行列は正定値ですか?


19

前書き

今日は、1年目の線形代数の学生の悩みの種である、行列の確定性を考慮します!どうやらこれにはまだ挑戦がありませんので、ここに行きます:

入力

  • 任意の便利な形式のA n×n 対称マトリックスA(もちろん、マトリックスの上部または下部のみを取ることもできます)
  • オプション:行列nのサイズn

何をすべきか?

課題は簡単です。実数値の行列n×n与えられると、Matrixは、もしそうなら真理値を出力し、そうでなければ偽値を出力することにより、正定かどうかを決定します。

ビルトインが実際に正確に機能するため、戦略/コードが「確かに」正しい結果をもたらす場合、間違った動作を引き起こす可能性のある数値的な問題を考慮する必要はありません。

誰が勝ちますか?

これはなので、バイト単位の最短コード(言語ごと)が勝ちます!


とにかく正定行列とは何ですか?

対称行列が正定値の場合、明らかに6つの等価な定式化があります。3つの簡単なものを再現し、より複雑なものについてはWikipediaを参照してください。

  • もしvRn{0}:vTAv>0、次いでA正定値です。
    これは、次のように再定式化できます。
    すべての非ゼロベクトルについて、との(標準)内積が正の場合、は正定です。vvAvA
  • ましょうである固有値の、今ならすべてです(固有値が正の場合)、は正定値です。説明(および必要な計算戦略)が長すぎてこの記事に含まれないため、固有値が何かわからない場合は、お気に入りの検索エンジンを使用して調べることをお勧めします。λii{1,,n}Ai{1,,n}:λ>0A
  • 場合コレスキー分解の存在する、すなわち、下三角行列が存在するよう、その後正定値です。負の引数のためにアルゴリズム中のルートの計算が失敗した場合、これは早期に返される「false」と同等であることに注意してください。ALLLT=AA

真実の出力

100010001

(1000020000300004)

(521211113)

(1222502030)

(7.152.452.459.37

偽の出力用

(少なくとも1つの固有値が0 /半正の正数)

(322240202)

(固有値は異なる符号/不定)

(100010001)

(0より小さいすべての固有値/負定)

(100010001)

(0より小さいすべての固有値/負定値)

(230350001)

(0より小さいすべての固有値/負定値)

(7.152.452.459.37)

(3つの正の固有値、1つの負の固有値/不定)

(7.152.451.233.52.459.372.713.141.232.7106.23.53.146.20.56)



数学表記をすべて読める(または「固有値」が何であるかをすべて知っている)と仮定するのではなく、探しているもののより良い定義を提供する必要があります。実用的な例も役立ちます。
シャギー

9
@Shaggy詰まるような背景がない限り、チャレンジの方が良いと思います。他の場所で固有値が何であるかについての多くの既存の説明があり、この投稿はすでに非常に大きくなっています。
小麦ウィザード

1
入力を対称行列に制限しなければ、課題はより良くなるでしょう。
ポルフォソルఠ_ఠ18年

1
固有値の符号をチェックするだけでも退屈だということです。私が知っているさまざまな味;)
ポルフォソルఠ_ఠ18年

回答:


11

C、108バイト

-1 Logernのバイトのおかげ
-3 ceilingcatおかげバイト

f(M,n,i)double**M;{for(i=n*n;i--;)M[i/n][i%n]-=M[n][i%n]*M[i/n][n]/M[n][n];return M[n][n]>0&(!n||f(M,n-1));}

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

ガウス消去法を実行し、すべての対角要素が正であるかどうかをチェックします(シルベスターの基準)。引数nは、行列のサイズから1を引いたものです。


おそらくダブルではなくフロートでキャラクターを保存しますか?
イェンス


i=0forループにドロップしf(M,n-1,0)て、3番目の引数として0を使用して再帰呼び出しと最初の呼び出しを行うと、別の文字を削ることができます。
イェンス

@Jens 1. doubleの代わりにfloatを使用すると、すぐに顕著な丸めエラーが発生する可能性があるため、1バイトを保存しても価値があるとは思いません。2.追加の引数を介して変数を初期化することは、私にはごまかしのように見えます。
-nwellnhof

@Logern Cの回答で「returnステートメントを省略する」トリックの使用を拒否します。しかし、保存された他のバイトに感謝します。
nwellnhof

9

MATLAB / Octave19 17 12バイト

@(A)eig(A)>0

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

関数eigは、昇順で固有値を提供します。したがって、最初の固有値がゼロより大きい場合、他の固有値も同様です。


f=最初にドロップすることができます-匿名関数は一般的に回答として受け入れられます。
Delfad0r

ヒントをありがとう!
ダニエルトゥリゾ

そのベクターであっても?興味深い
ダニエルトゥリゾ

1
+1。オンラインで試すためのリンクを追加しました。気にしないでください。配列であるにもかかわらず、出力値が、リンクされた@ Delfad0rに従って正しい「真の」値または「偽の」値としてカウントされることも証明していることに注意してください。
トムカーペンター

2
そうは言っても、TIOでの最初の「偽」テストケースでは失敗します。私が原因精度の問題に推測している-固有値の一つが出てくるよう8.9219e-17ではなく、0
トム・カーペンター

7

ゼリー11 10バイト

ṖṖ€$ƬÆḊṂ>0

シルベスターの基準を使用します

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

使い方

ṖṖ€$ƬÆḊṂ>0  Main link. Argument: M (matrix)

   $Ƭ       Do the following until a fixed point is encountered.
Ṗ             Pop; remove the last row of the matrix.
 Ṗ€           Pop each; remove the last entry of each row.
     ÆḊ     Take the determinants of the resulting minors.
       Ṃ    Take the minimum.
        >0  Test if the least determinant is positive, i.e., if all determinants are.


6

Haskell、56バイト

f((x:y):z)=x>0&&f[zipWith(-)v$map(u/x*)y|u:v<-z]
f[]=1>0

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

基本的にnwellnhofの回答のポートです。ガウス消去を実行し、主対角線上の要素が正であるかどうかを確認します。

丸め誤差のために最初のfalsey出力は失敗しますが、理論的には無限の精度で動作します。Curtis Bechtelの提案のおかげで、出力はすべて正しくなりました。


2
追加inputs :: [[[Rational]]]して正しい答えを得ることができます
カーティスベクテル

4

4番目のテストケースはFalseですか?
tsh

@tsh修正済み、私は愚かです!
ミスターXcoder

8
Mathematica にこの機能組み込まれているのは面白いが、その名前はソリューションよりも長い。
フェデリコポロニ

@FedericoPoloni:NullSpaceまたはMatrixRankを使用したソリューションはさらに短くなりませんか?ヌル空間がゼロの場合、行列は正定値です。
フィルH

@PhilHいいえ、それだけでは機能しません。たとえば、2番目の偽の例((1、-1,1)の対角行列)のランクは3ですが、正定ではありません。
フェデリコポロニ




2

MATL、6バイト

さらに少ないバイト数@Mrを使用して実行することもできます。Xcoderは5バイトのMATL回答を見つけることができました!

YvX<0>

説明

Yv     compute eigenvalues
  X<   take the minimum
    0> check whether it is greather than zero

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


最初の偽のテストケースでは失敗します。削除された回答を参照しください。
ミスターXcoder

1
@ Mr.Xcoderああ、あなたも私の前に答えを提出しました。丸めの問題に依存するため、回答を元に戻す必要があると思います。(答えは限られた精度の算術を使用すると期待できると思います-ここのCAS言語のみが正確な計算を使用すると思います。)
flawr

あなたのアドバイスに従って、削除を取り消しました
氏Xcoder

1

メープル、33バイト

(つまり、私の2セント)

with(LinearAlgebra):
IsDefinite(A)

こんにちは、PPCGへようこそ。私はMapleに不慣れですが、改行は必要ですか?
ジョナサンフレッチ

@JonathanFrechこんにちは、ありがとう。いいえ、ちがいます。私はそれを数えませんでした。
ポルフォソルఠ_ఠ18年

私にとって、あなたの現在のバイト数は改行文字を反映しているようです。
ジョナサンフレッチ

@JonathanFrech Duh、私の悪い
polfosolఠ_ఠ18年

1
さて...今、あなたのコードとあなたのバイト数は一致しません。
ジョナサンフレッチ

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