サイズN x N
の行列の行列式の値を見つけるのに最適なアルゴリズムはどれですか?
Nxn行列の行列式を見つける最も簡単な方法(実際には悪い方法ではありません)は、行の削減です。行列式に関するいくつかの単純なルールを覚えておくと、次の形式で解決できます。
det([〜#〜] a [〜#〜])=α* det([〜#〜 ] r [〜#〜])、ここで[〜#〜] r [〜#〜]は元の行列の行階層形式[〜#〜] a [〜#〜]、αは係数です。
行の階層形式で行列の行列式を見つけることは本当に簡単です。対角線の積を見つけるだけです。元の行列の行列式を解く[〜#〜] a [〜#〜]次に、行の階層形式を見つけて、αを計算します[〜#〜] r [〜#〜]。
簡単な定義については、これを参照してください link
注:すべての定義で先頭のエントリに1が必要なわけではなく、このアルゴリズムでは不要です。
行の交換、別の行の倍数の追加など.
[〜#〜] b [〜#〜]がの行を乗算して得られる行列である場合#〜] a [〜#〜]ゼロ以外の定数ßによって、
det([〜#〜] b [〜#〜])=ß* det([〜#〜 ] a [〜#〜])
[〜#〜] b [〜#〜]が[〜 #〜] a [〜#〜]、次に
det([〜#〜] b [〜#〜])= -det([〜#〜] a [〜#〜])
[〜#〜] b [〜#〜]が[〜#〜] a [〜#〜]、次に
det([〜#〜] b [〜#〜])= det([〜#〜] a [〜#〜])
行列式は、ほとんどの場合、ルール3のみ(Aの対角にゼロがない場合)で見つけることができ、すべてのケースでルール2と3のみで見つけることができることに注意してください。ルール1は、紙、分数を避けようとしています。
(私は各ルールをより明確に示すために不要な手順を実行します)| 2 3 3 1 | A=| 0 4 3 -3 | | 2 -1 -1 -3 | | 0 -4 -3 2 | R2 <-> R3, -α -> α (Rule 2) | 2 3 3 1 | -| 2 -1 -1 -3 | | 0 4 3 -3 | | 0 -4 -3 2 | R2 - R1 -> R2 (Rule 3) | 2 3 3 1 | -| 0 -4 -4 -4 | | 0 4 3 -3 | | 0 -4 -3 2 | R2/(-4) -> R2, -4α -> α (Rule 1) | 2 3 3 1 | 4| 0 1 1 1 | | 0 4 3 -3 | | 0 -4 -3 2 | R3 - 4R2 -> R3, R4 + 4R2 -> R4 (Rule 3, applied twice) | 2 3 3 1 | 4| 0 1 1 1 | | 0 0 -1 -7 | | 0 0 1 6 | R4 + R3 -> R3 | 2 3 3 1 | 4| 0 1 1 1 | = 4 ( 2 * 1 * -1 * -1 ) = 8 | 0 0 -1 -7 | | 0 0 0 -1 |
最初の調査を行った場合、おそらくN> = 4の場合、行列式の計算が非常に複雑になることがわかります。アルゴリズムに関しては、私はあなたに マトリックスの行列式に関するWikipediaの記事 、特に「アルゴリズムの実装」セクションを指摘します。
私の経験から、LUまたは Alglib などの既存の行列ライブラリでQR分解アルゴリズムを簡単に見つけることができます。ただし、アルゴリズム自体はそれほど単純ではありません。
LU=因数分解についてはあまり詳しくありませんが、LまたはUを取得するには、初期行列を三角形にする必要があることを知っています(Uは上三角、Lは下三角)ただし、一部のnxn行列Aの行列を三角形式で取得し、コードで使用する演算がRb-k * Raであると仮定すると、iからdet(A)=ΠT(i、i)を解くことができます。三角行列Tの場合、= 0からn(つまり、det(A)= T(0,0)x T(1,1)x ... x T(n、n))。このリンクを確認して、 mについて話します http://matrix.reshish.com/determinant.php