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 будет иметь только один элемент в строке. Он будет использоваться для реализации фильтра Калмана с использованием разреженных матриц, см.

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

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 не очень большой, вы также можете использовать плотный обратный.

Другие вопросы по тегам