私は自分自身へのプログラミングの課題として(そしてPythonでコーディングすることを学ぶ目的で)小さな行列演算ライブラリを作成しており、2x2、3x3、および4x4行列の行列式を計算するタスクに出くわしました。
線形代数の理解に関しては、最初の2つを実行するためにサラスの方法を実装する必要がありますが、これをPythonで、またはより大きなサイズの行列に取り組む方法がわかりません。ヒント、ヒント、ガイドをいただければ幸いです。
私は自分自身へのプログラミングの課題として(そしてPythonでコーディングすることを学ぶ目的で)小さな行列演算ライブラリを作成しており、2x2、3x3、および4x4行列の行列式を計算するタスクに出くわしました。
線形代数の理解に関しては、最初の2つを実行するためにサラスの方法を実装する必要がありますが、これをPythonで、またはより大きなサイズの行列に取り組む方法がわかりません。ヒント、ヒント、ガイドをいただければ幸いです。
Sarrus の規則は、3x3 の行列式を解くためのニーモニックにすぎず、そのサイズを超えると役に立ちません。
任意の大きさの正方行列の行列式を計算するには、ライプニッツの公式を調べる必要があります。この式の良いところは、行列のn*n
行列式が、その(n-1)*(n-1)
サブ行列のいくつかの行列式の組み合わせによって決定できることです。これは、再帰関数の解法に適しています。
ライプニッツの公式の背後にあるアルゴリズムを理解でき、以前に再帰関数を扱ったことがある場合、これをコード (Python など) に変換するのは簡単で、4x4 行列以降の行列式を見つけることができます!
M が float の行列である場合、ここに凝縮メソッド (chio?) の醜いバージョンがあります。うまくいくと思います...
私は python 2.7.2 を使用しています
from itertools import product, islice
def det(M,prod=1):
dim = len(M)
if dim == 1:
return prod * M.pop().pop()
it = product(xrange(1,dim),repeat=2)
prod *= M[0][0]
return det([[M[x][y]-M[x][0]*(M[0][y]/M[0][0]) for x,y in islice(it,dim-1)] for i in xrange(dim-1)],prod)