Python 矩阵的逆

62 投票
7 回答
130161 浏览
提问于 2025-04-11 09:34

我想知道在Python中怎么得到一个矩阵的逆矩阵。我自己实现过,但是是用纯Python写的,我觉得可能有更快的模块可以做到这一点。

7 个回答

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

就变得既不是奇异的,也不是接近奇异的,这样例子就能给出有意义的结果……在处理浮点数时,必须注意不可避免的舍入误差的影响。

57

首先,确保你真的需要对矩阵进行反转。其实很多时候这是不必要的,而且可能会导致计算不稳定。大多数人问如何反转一个矩阵,其实他们想知道的是如何解方程Ax = b,其中A是一个矩阵,x和b是向量。直接用代码来解方程Ax = b会比先计算A的反转再乘以B更高效、更准确。即使你需要为多个b值解这个方程,反转A也不是个好主意。如果你必须为多个b值解这个系统,保存A的Cholesky分解就可以了,但不要去反转它。

更多信息请查看 不要反转那个矩阵

108

如果你在做矩阵操作,建议你看看 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 模块,当你只处理一种数据类型时,它比列表更高效。

撰写回答