Python слева умножения матрицы с инверсией разреженной матрицы
Я пытаюсь вычислить выражение вида K = P*CT*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⁶x10^6, S~100x100, C=100x10⁶. Диагональ P и S симметричны, а C будет иметь только один элемент в строке. Он будет использоваться для реализации фильтра Калмана с использованием разреженных матриц, см.
1 ответ
Как обходной путь может сделать
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
не очень большой, вы также можете использовать плотный обратный.