Python的逆矩阵

时间:2008-10-17 05:30:50

标签: python algorithm matrix linear-algebra matrix-inverse

如何在python中得到矩阵的逆矩阵?我自己实现了它,但它是纯粹的python,我怀疑有更快的模块可以做到。

7 个答案:

答案 0 :(得分:101)

如果你进行矩阵操作,你应该看看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 :(得分:53)

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

请参阅Don't invert that matrix

答案 2 :(得分: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]])

既不是单数也不是单数,而且这个例子给出了有意义的结果......在处理浮点数时,必须注意不可避免的舍入误差的影响。

感谢您的贡献,

OldAl。

答案 3 :(得分:6)

您可以计算递归矩阵的行列式 然后形成相邻的矩阵

Here is a short tutorial

我认为这只适用于方形矩阵

计算这些的另一种方法涉及克 - 施密特正交化,然后转置矩阵,正交矩阵的转置是它的反转!

答案 4 :(得分:5)

Numpy适合大多数人,但您也可以matrices in Sympy

尝试在http://live.sympy.org/

运行这些命令
M = Matrix([[1, 3], [-2, 3]])
M
M**-1

为了好玩,请尝试M**(1/2)

答案 5 :(得分:3)

对于那些像我这样的人,他们正在寻找不涉及pandasnumpy的纯Python解决方案,请查看以下GitHub项目:https://github.com/ThomIves/MatrixInverse

它慷慨地很好地说明了该过程看起来像“幕后”。作者很好地描述了分步方法,并提供了一些易于遵循的实际示例。

这只是那里的一小段代码,非常简要地说明了该方法(AM是源矩阵,IM是相同大小的恒等矩阵):

def invert_matrix(AM, IM):
    for fd in range(len(AM)):
        fdScaler = 1.0 / AM[fd][fd]
        for j in range(len(AM)):
            AM[fd][j] *= fdScaler
            IM[fd][j] *= fdScaler
        for i in list(range(len(AM)))[0:fd] + list(range(len(AM)))[fd+1:]:
            crScaler = AM[i][fd]
            for j in range(len(AM)):
                AM[i][j] = AM[i][j] - crScaler * AM[fd][j]
                IM[i][j] = IM[i][j] - crScaler * IM[fd][j]
    return IM

但是请注意整个过程,您将学到更多,而不仅仅是复制粘贴此代码!还有一个Jupyter笔记本,顺便说一句。

希望对某人有帮助,我个人认为这对我无法使用任何非标准软件包的非常特殊的任务(Absorbing Markov Chain)非常有用。

答案 6 :(得分:1)

如果你讨厌numpy,请拿出RPy和R的本地副本,然后使用它。

(我也会回声让你真的需要反转矩阵。例如,在R中,linalg.solve和solve()函数实际上并不进行完全反转,因为它是不必要的。)< / p>