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