Я пытаюсь вычислить выражение вида 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⁶x10^6, S~100x100, C=100x10⁶. P диагональный и S симметричный, а C будет иметь только один элемент в строке. Он будет использоваться для реализации фильтра Калмана с использованием разреженных матриц, см.
http://en.wikipedia.org/wiki/Kalman_filter#The_Kalman_filter
K
. Что вы можете сделать без вычисления обратного, так это вычислитьKx
для некоторого вектораx
, что потребовало бы решения линейной системы. - person Sven Marnach   schedule 14.10.2011spsolve()
. - person Sven Marnach   schedule 14.10.2011