Cla*_*diu 60 python algorithm matrix linear-algebra matrix-inverse
如何在python中得到矩阵的逆?我自己实现了它,但它是纯粹的python,我怀疑有更快的模块可以做到这一点.
Map*_*pad 105
如果你进行矩阵操作,你应该看看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.
Run Code Online (Sandbox Code Playgroud)
您还可以查看数组模块,当您只需处理一种数据类型时,这是一种更有效的列表实现.
use*_*367 10
遗憾的是,所选择的矩阵在这里再次重复,要么是单一的,要么是严重的条件:
A = matrix( [[1,2,3],[11,12,13],[21,22,23]])
Run Code Online (Sandbox Code Playgroud)
根据定义,当乘以矩阵A本身时A的倒数必须给出单位矩阵.在备受赞誉的解释中选择的A不会那样做.事实上,仅仅查看逆向就可以得出反演无法正常工作的线索.看一下单个术语的大小 - 与原始A矩阵的术语相比,它们非常非常大...
值得注意的是,人们在选择矩阵的例子时经常会选择一个奇异的矩阵!
我确实遇到了解决方案的问题,因此请进一步研究.在ubuntu-kubuntu平台上,debian包numpy没有矩阵和linalg子包,所以除了导入numpy之外,还需要导入scipy.
如果A的对角线项乘以足够大的因子,比如说2,则矩阵很可能不再是单数或接近单数.所以
A = matrix( [[2,2,3],[11,24,13],[21,22,46]])
Run Code Online (Sandbox Code Playgroud)
变得既不是单数也不是单数,并且这个例子给出了有意义的结果......当处理浮点数时,必须注意不可避免的舍入误差的影响.
谢谢你的贡献,
OldAl.
对于像我这样正在寻找不涉及pandas
或不numpy
涉及的纯 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
Run Code Online (Sandbox Code Playgroud)
但是请务必遵循整个内容,您将学到的不仅仅是复制粘贴此代码!还有一个 Jupyter 笔记本,顺便说一句。
希望对某人有所帮助,我个人发现它对我无法使用任何非标准包的非常特殊的任务(吸收马尔可夫链)非常有用。
尝试在http://live.sympy.org/上运行这些命令
M = Matrix([[1, 3], [-2, 3]])
M
M**-1
Run Code Online (Sandbox Code Playgroud)
为了好玩,试试吧 M**(1/2)