2008-10-17 156 views
55

如何获得python矩阵的逆矩阵?我自己实现了它,但它是纯粹的Python,我怀疑有更快的模块来做到这一点。Python的逆矩阵

+0

你可以请出示你的算法? – 2016-12-23 12:05:22

+0

这里有答案,如果有人想要一个代码片段 https://stackoverflow.com/questions/32114054/matrix-inversion-without-numpy – Alex 2017-09-30 10:20:24

回答

99

如果你做矩阵处理,你应该看看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模块,这是一种更有效的执行名单时,你必须只处理一个数据类型。

+0

numpy也出现在书“美丽的代码”。 :-) – Deestan 2008-10-17 07:35:21

+3

此处还要注意,没有发生倒转,并且按照John D. Cook的答案,系统直接被解决。 – 2008-10-26 16:12:39

+0

考虑使用numpy [数组而不是矩阵](https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html#array-or-matrix-which-should-i -使用)。随着[`numpy.linalg`](https://docs.scipy.org/doc/numpy/reference/routines.linalg.html),你可以得到几乎所有你想要的,而不使用笨拙的`numpy.matrix `。 – Praveen 2017-06-13 02:38:17

1

如果你讨厌numpy,就拿出RPy和R的本地副本,然后用它来代替。因为它是不必要的,所以在R中,例如,linalg.solve和solve()函数实际上并不实际完成一个反演)。

+3

从来没有使用R,但为什么外部程序和它的Python绑定程序比最知名的Python的科学软件包更好? – 2012-08-16 14:25:11

52

确保您确实需要反转矩阵。这通常是不必要的,并且可能在数值上不稳定。当大多数人问如何反转矩阵时,他们真的想知道如何求解Ax = b,其中A是矩阵,x和b是向量。使用代码直接求解方程Ax = b的代码比计算A inverse反而将B乘以B反而更加高效和准确。即使您需要为许多b值求解Ax = b,也不是一个好主意倒置A.如果必须解决多个b值的系统问题,请保存A的Cholesky分解,但不要倒置它。

请参阅Don't invert that matrix

6

你可以计算出它是递归 矩阵的行列式,然后形成邻接矩阵

Here is a short tutorial

我觉得这只是对方阵

计算的另一种方式工作,这些涉及到克然后转置矩阵,正交矩阵的转置就是它的逆!

10

很可惜的是,选择矩阵,这里再次重复,或者是单数或严重空调:

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]]) 

变得既不奇异也不接近奇异和例子给出有意义的结果......当浮点数处理一个必须警惕的inavoidable舍入误差的影响。

感谢您的贡献,

OldAl。