Возможные способы вычисления X = A - inv (B) * Y * inv (B) и X = Y + A '* inv (B) * A - PullRequest
1 голос
/ 27 мая 2009

У меня две проблемы. Я должен рассчитать два уравнения:

X = A - инв (B) * Y * инв (B)

и

X = Y + A '* inv (B) * A

, где A, B и Y - известные матрицы p * p (p может быть маленьким или большим, в зависимости от ситуации). Матрицы довольно плотные, без какой-либо структуры (за исключением того, что B, конечно, не является особенным).

Можно ли решить X в этих уравнениях, не обращая матрицу B? Я должен вычислить эти уравнения n раз, при этом n равно сотням или тысячам, и все матрицы меняются со временем.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 17 июня 2011

Если вы можете выразить свои обновления в матрице B в следующих терминах:

Bnew = B + u*s*v

тогда вы можете явно выразить обновление inv(B), используя формулу Шермана-Моррисона-Вудбери:

inv(B + u*s*v) = inv(B) - inv(B)*u*inv(s + v*inv(B)*u)*v*inv(B)

Если u и v являются векторами (столбец и строка соответственно), а s скалярно, то это выражение упрощается:

inv(B + u*s*v) = inv(B) - inv(B)*u*v*inv(B)/(s + v*inv(B)*u)

Вам нужно будет только вычислить inv(B) один раз, а затем обновить его, когда он изменится без дополнительных инверсий.

Может быть предпочтительнее не вычислять полное обратное, просто простые «матричные деления» для y и (ynew - y) или a и (заново - a) в зависимости от размера «n» относительно «p» в твоей проблеме.

0 голосов
/ 18 июня 2009

Memo-ize inv (B), т. Е. Инвертируйте только B, когда он изменяется, и сохраняйте обратное.

Если изменения в B невелики, возможно, вы могли бы использовать дельта-аппроксимацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...