python矩阵求逆算法_Python将矩阵的乘法与稀疏矩阵的逆相加

我正在尝试计算形式K = P * C.T * S ^ -1(卡尔曼滤波器的实现)的表达式

所有涉及的矩阵都是稀疏的,我当然希望避免计算实际的逆矩阵.

我试过用

import scipy.sparse.linalg as spln

self.K = self.P.dot(spln.spsolve(S.T, C).T)

问题是spsolve期望它的第二个参数是一个向量而不是一个矩阵.

编辑:

澄清,Matlab中的问题可以通过K = P *(C / S)来解决,所以我正在寻找的是一种类似于spsolve但可以接受矩阵作为其第二个参数的方法.这当然可以通过将C分成多个列向量c1..cn并解决它们中的每一个然后将它们重新组装成矩阵来完成,但我怀疑这样做既麻烦又低效.

EDIT2和3:

矩阵的尺寸通常约为P~10×10 ^ 6,S~100×100,C = 100×10 6. P对角线和S对称,C每行只有一个元素.

它将用于使用稀疏矩阵的卡尔曼滤波器的实现,参见

最佳答案 作为一种解决方法可以做到

import numpy as np

from scipy.sparse.linalg import splu

def spsolve2(a, b):

a_lu = splu(a)

out = np.empty((A.shape[1], b.shape[1]))

for j in xrange(b.shape[1]):

out[:,j] = a_lu.solve(b[:,j])

return out

self.K = self.P.dot(spsolve2(S.T, C).T)

但是,是的,这是一个spsolve不接受矩阵的错误.

但是,由于你的S不是很大,你也可以使用密集逆.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值