2009-08-14 44 views
3

これは、John Carmackが4x4行列の行列式を計算するために使用するアプローチです。私の調査から、私はlaplace拡張定理のように始まったが、それから私が読んだ論文と一致しない3x3行列式を計算することになると判断した。これはどの行列式の計算方法ですか?

// 2x2 sub-determinants 
    float det2_01_01 = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0]; 
    float det2_01_02 = mat[0][0] * mat[1][2] - mat[0][2] * mat[1][0]; 
    float det2_01_03 = mat[0][0] * mat[1][3] - mat[0][3] * mat[1][0]; 
    float det2_01_12 = mat[0][1] * mat[1][2] - mat[0][2] * mat[1][1]; 
    float det2_01_13 = mat[0][1] * mat[1][3] - mat[0][3] * mat[1][1]; 
    float det2_01_23 = mat[0][2] * mat[1][3] - mat[0][3] * mat[1][2]; 

    // 3x3 sub-determinants 
    float det3_201_012 = mat[2][0] * det2_01_12 - mat[2][1] * det2_01_02 + mat[2][2] * det2_01_01; 
    float det3_201_013 = mat[2][0] * det2_01_13 - mat[2][1] * det2_01_03 + mat[2][3] * det2_01_01; 
    float det3_201_023 = mat[2][0] * det2_01_23 - mat[2][2] * det2_01_03 + mat[2][3] * det2_01_02; 
    float det3_201_123 = mat[2][1] * det2_01_23 - mat[2][2] * det2_01_13 + mat[2][3] * det2_01_12; 

    return (- det3_201_123 * mat[3][0] + det3_201_023 * mat[3][1] - det3_201_013 * mat[3][2] + det3_201_012 * mat[3][3]); 

誰かがこのアプローチがどのように機能するのかを説明したり、同じアプローチを使用した良い書き方を教えてもらえますか?


この行列は重要な行です。

答えて

5

未成年者を使用する方法であるようです。数学的な側面は、(それが(一部を伴う-1)に説明すべき要素を基本的にあなたが計算するために小さく、容易なものに行列を削減し、それらの結果をまとめる

http://en.wikipedia.org/wiki/Determinant#Properties_characterizing_the_determinant

でWikipediaで見つけることができます私がリンクしているページ)。

+0

yep - それです。シンプルな展開されたラプラス展開。 –

+0

さらに詳しい情報が必要な場合は、「補因子展開」 – Martijn

+0

も検索し、丸め誤差が発生する可能性があります。ピボットは通常、(例えば)ピボットとして最大の数字を選択することによって潜在的に近い数字を差し引くのを避けるために、いくつかのロジックを使用します。 –

2

彼はここで

det(M) = sum(M[0, i] * det(M.minor[0, i]) * (-1)^i) 

minor[0, i]があなたの元の行列と(-1)*iスタンドから0行目とi番目の列を交配することにより得られる行列で、擬似コードでは、あなたが計算することができ、標準的な式を使用しています-1i番目の累乗です。

異なる行を使用する場合や、列の上にループを作成する場合は、(全体記号まで)数式が機能します。 detがどのように定義されているかについて考えるならば、それはかなり自明です。 - あなたが2x2行列の行列のための標準的な式を認識すべきである

det(M) = M[0, 0] * M[1, 1] * (+1) + M[0, 1] * M[1, 0] * (-1) 

または、むしろ、行1 0、

-det(M) = M[1, 0] * M[0, 1] * (+1) + M[1, 1] * M[0, 0] * (-1) 

により:2行列に対して、これはなる方法に注意してください。 3マトリックスがN = [[a, b, c], [d, e, f], [g, h, i]]として構成するため

同様に、これは2x2決定の各々を展開後もちろん教科書式

a*e*i + b*f*g + c*d*h - c*e*g - a*f*h - b*d*i 

なる式

det(N) = a * det([[e, f], [h, i]]) - b * det([[d, f], [g, i]]) + c * det([[d, e], [g, h]]) 

につながります。

4行列Xを使用すると、det(X)を計算するには、4つの微係数の行列式を計算する必要があります。各微係数は3x3行列です。それらをさらに拡張して、いくつかの係数を持つ行列を決定することができます。 3x3行列の場合と同様に、自分で実際に試してください。

+0

私は2x2行列の行列式が関係している限り理解していますが、3x3が必要な場所はわかりません。 –

+0

あなたの狭い質問に答えるために、私が引用した公式は次のように述べています:(1)いくつかの '3x3'行列に対して' det'を計算します。 (2)それらに係数を加える。 –

+0

NxN行列式の計算をN-1xN-1行列式の計算に減らし、2x2になるまで続けます。したがって、4x4はいくつかの3x3に縮小され、2x2にさらに削減されます。 –

関連する問題