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每行只有一个元素.
它将用于使用稀疏矩阵的卡尔曼滤波器的实现,参见

http://en.wikipedia.org/wiki/Kalman_filter#The_Kalman_filter

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

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不是很大,你也可以使用密集逆.

点赞