web-dev-qa-db-ja.com

行列の行列式を見つけるのに最適なアルゴリズムは何ですか?

サイズN x Nの行列の行列式の値を見つけるのに最適なアルゴリズムはどれですか?

27
perilbrain

ここ は広範囲にわたる議論です。

アルゴリズムはたくさんあります。

簡単なのは LU分解 を取ることです。その後、

_ det M = det LU = det L * det U
_

LUはどちらも三角形で、行列式はLUの対角要素の積です。それはO(n^3)です。より効率的なアルゴリズムが存在します。

28
dfrankow

行の削減

Nxn行列の行列式を見つける最も簡単な方法(実際には悪い方法ではありません)は、行の削減です。行列式に関するいくつかの単純なルールを覚えておくと、次の形式で解決できます。

det([〜#〜] a [〜#〜])=α* det([〜#〜 ] r [〜#〜])、ここで[〜#〜] r [〜#〜]は元の行列の行階層形式[〜#〜] a [〜#〜]、αは係数です。

行の階層形式で行列の行列式を見つけることは本当に簡単です。対角線の積を見つけるだけです。元の行列の行列式を解く[〜#〜] a [〜#〜]次に、行の階層形式を見つけて、αを計算します[〜#〜] r [〜#〜]

知っておくべきこと

行階層形式とは何ですか?

簡単な定義については、これを参照してください link
注:すべての定義で先頭のエントリに1が必要なわけではなく、このアルゴリズムでは不要です。

基本的な行操作を使用してRを見つけることができます

行の交換、別の行の倍数の追加など.

行列式の行演算のプロパティからαを導出します

  1. [〜#〜] b [〜#〜]の行を乗算して得られる行列である場合#〜] a [〜#〜]ゼロ以外の定数ßによって、

    det([〜#〜] b [〜#〜])=ß* det([〜#〜 ] a [〜#〜]

    • 言い換えれば、行列式の前にそれを引き出すだけで、行から定数を本質的に「分解」することができます。
  2. [〜#〜] b [〜#〜][〜 #〜] a [〜#〜]、次に

    det([〜#〜] b [〜#〜])= -det([〜#〜] a [〜#〜]

    • 行を交換する場合は、記号を反転します。
  3. [〜#〜] 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 |

9
Shelby Oldfield

最初の調査を行った場合、おそらくN> = 4の場合、行列式の計算が非常に複雑になることがわかります。アルゴリズムに関しては、私はあなたに マトリックスの行列式に関するWikipediaの記事 、特に「アルゴリズムの実装」セクションを指摘します。

私の経験から、LUまたは Alglib などの既存の行列ライブラリでQR分解アルゴリズムを簡単に見つけることができます。ただし、アルゴリズム自体はそれほど単純ではありません。

7

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

0
efwf