2009-05-27 2 views
1

У меня две проблемы. Я должен вычислить два уравнения:Возможные способы расчета X = A - inv (B) * Y * inv (B) и X = Y + A '* inv (B) * A

X = A - Inv (B) * Y * и (B)

и

X = Y + A»* и (B) * A

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

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

спасибо.

+0

Я думаю, нет для общего случая, хотя моя алгебра fu может быть лучше. Если вы даете больше контекста (для чего вам нужен X для? Существуют ли отношения между A и B?), В нем может быть что-то. – bayer

+0

Математика связана, но не связана с программированием. Есть много Math Q & A сайтов, там люди, извините :( –

ответ

0

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

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

1

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