Pythonの逆行列
-
03-07-2019 - |
質問
Pythonで行列の逆行列を取得するにはどうすればよいですか?私はそれを自分で実装しましたが、それは純粋なpythonであり、それを行うためのより速いモジュールがあると思います。
解決
マトリックス操作を行う場合は、 numpy をご覧ください。これは主にCで書かれたモジュールで、純粋なpythonでのプログラミングよりもはるかに高速です。マトリックスを反転し、他のマトリックス操作を行う方法の例を次に示します。
from numpy import matrix
from numpy import linalg
A = matrix( [[1,2,3],[11,12,13],[21,22,23]]) # Creates a matrix.
x = matrix( [[1],[2],[3]] ) # Creates a matrix (like a column vector).
y = matrix( [[1,2,3]] ) # Creates a matrix (like a row vector).
print A.T # Transpose of A.
print A*x # Matrix multiplication of A and x.
print A.I # Inverse of A.
print linalg.solve(A, x) # Solve the linear equation system.
array モジュールもご覧ください。 1つのデータ型のみを処理する必要がある場合のリストのはるかに効率的な実装。
他のヒント
本当にマトリックスを反転する必要があることを確認してください。これはしばしば不必要であり、数値的に不安定になる可能性があります。ほとんどの人が行列の反転方法を尋ねるとき、彼らは本当にAx = bを解く方法を知りたいのです。ここで、Aは行列で、xとbはベクトルです。 Aの逆数を計算してから逆数にBを乗算するよりも、xの方程式Ax = bを直接解くコードを使用する方が効率的で正確です。 Aを反転します。複数のb値についてシステムを解く必要がある場合は、Aのコレスキー分解を保存しますが、反転しないでください。
ここで繰り返される選択された行列が特異であるか、条件が悪いことは残念です:
A = matrix( [[1,2,3],[11,12,13],[21,22,23]])
定義により、Aの逆行列は、行列A自体を乗算したときに単位行列を与える必要があります。賞賛された説明で選ばれたAはそれをしません。実際、逆を見るだけで、反転が正しく機能しなかった手がかりが得られます。個々の項の大きさを見てください-元のA行列の項と比較して非常に大きいです...
マトリックスの例を選ぶとき、人間が特異なマトリックスを選ぶことに成功することは注目に値します!
ソリューションに問題があったので、さらに調査しました。 ubuntu-kubuntuプラットフォームでは、debianパッケージnumpyにはマトリックスとlinalgサブパッケージがないため、numpyのインポートに加えて、scipyもインポートする必要があります。
Aの対角項に十分な大きさの係数(2など)を掛けると、行列は特異またはほぼ特異でなくなる可能性が高くなります。
A = matrix( [[2,2,3],[11,24,13],[21,22,46]])
単数でもほとんど単数でもない例で、意味のある結果が得られます...浮動小数点を扱うときは、避けられない丸め誤差の影響に注意する必要があります。
ご協力ありがとうございます
OldAl。
再帰的な行列の行列式を計算できます そして、隣接行列を形成します
これは正方行列でのみ機能すると思います
これらを計算する別の方法は、グラムシュミットの直交化を含み、次に行列を転置することです。直交化された行列の転置はその逆です!
Numpyはほとんどの人に適していますが、 Sympyのマトリックス
でこれらのコマンドを実行してください。M = Matrix([[1, 3], [-2, 3]])
M
M**-1
お楽しみに、 M **(1/2)
numpyが嫌いなら、RPyとRのローカルコピーを取り出して、代わりに使用してください。
(また、マトリックスを本当に反転させる必要があるようにエコーします。たとえば、Rでは、linalg.solveとsolve()関数は実際には完全な反転を行いません。これは不要だからです。)