Быстрая и эффективная обратная матрица верхней диагонали - PullRequest
2 голосов
/ 18 июня 2011

Я вычисляю полиномиальную гауссовскую плотность *1001* для огромного числа раз в проекте, где я обновляю ковариационную матрицу на ранг-1.Вместо того, чтобы вычислять ковариацию с нуля, я использовал функцию cholupdate, чтобы добавить новый образец в ковариацию и удалить новый образец в ковариацию.Таким образом, сообщается, что обновление выполняется в $ O (n ^ 2) $, в отличие от $ O (n ^ 3) $ -холесской факторизации ковариационной матрицы.

persistent R
if (initialize) % or isempty(R)
    % compute covariance V
    R = chol(V);
else
    R = cholupdate(R,xAdded);

detVar = prod(diag(R))^2;
Rt = R';
coeff = 1/sqrt((2*pi)^dimension*detVar);
y = Rt\x;
logp = log(coeff) - 1/2 * norm(y)^2;

На самом деле коддовольно сложно, но я упростил это здесь.Интересно, есть ли более быстрый способ вычисления обратного (часть Rt\x в коде) верхней треугольной матрицы в MATLAB.Есть ли у вас какие-либо идеи сделать это более эффективно в MATLAB?

Обратите внимание, что вычисление детерминанта также выполняется быстрее.Так что новый метод также будет неплох для вычисления определителя.

1 Ответ

2 голосов
/ 19 июня 2011

Функция mldivide является достаточно умной для проверки треугольных матриц, и в этом случае для эффективного решения линейной системы используется метод прямое / обратное замещение :

AX=B  <-->  X=inv(A)*B  <-->  X=A\B

Lx=b

(вычислить x1, подставить его во второе уравнение и вычислить x2, подставить в третье ...)

...