Наиболее эффективная матричная инверсия в MATLAB - PullRequest
7 голосов
/ 15 февраля 2011

При вычислении инверсии для некоторой квадратной матрицы A в MATLAB использование

Ai = inv(A)
% should be the same as:
Ai = A^-1

MATLAB обычно уведомляет меня, что это не самый эффективный способ инвертирования.Так что же более эффективно?Если у меня есть система уравнений, то, вероятно, я использую операторы /, \.Но иногда мне нужно обратное для других вычислений.

Какой самый эффективный способ инвертировать?

Ответы [ 4 ]

11 голосов
/ 15 февраля 2011

Я бы порекомендовал использовать svd (если вы действительно не уверены, что ваша матрица не плохо подготовлена).Затем, основываясь на единичных ценностях, вы принимаете решение о дальнейших действиях.Это может звучать как «чрезмерный» подход, но в долгосрочной перспективе он окупится.

Теперь, если ваша матрица A действительно обратима, то совпадение pseudo inverse из A с inv(A)однако, если вы близки к «сингулярности», вы легко примете правильное решение, как поступить, чтобы действительно сделать pseudo inverse.Естественно, эти решения будут зависеть от вашей заявки.

Добавлен простой пример:

> A= randn(3, 2); A= [A A(:, 1)+ A(:, 2)]
A =
  -1.520342  -0.239380  -1.759722
   0.022604   0.381374   0.403978
   0.852420   1.521925   2.374346

> inv(A)
warning: inverse: matrix singular to machine precision, rcond = 0
ans =
   Inf   Inf   Inf
   Inf   Inf   Inf
   Inf   Inf   Inf

> [U, S, V]= svd(A)
U =
  -0.59828  -0.79038   0.13178
   0.13271  -0.25993  -0.95646
   0.79022  -0.55474   0.26040

S =
Diagonal Matrix
  3.6555e+000            0            0
            0  1.0452e+000            0
            0            0  1.4645e-016

V =
   0.433921   0.691650   0.577350
   0.382026  -0.721611   0.577350
   0.815947  -0.029962  -0.577350

> s= diag(S); k= sum(s> 1e-9) % simple thresholding based decision
k =  2

> Ainv= (U(:, 1: k)* diag(1./ s(1: k))* V(:, 1: k)')'
Ainv =
  -0.594055  -0.156258  -0.273302
   0.483170   0.193333   0.465592
  -0.110885   0.037074   0.192290

> A* Ainv
ans =
   0.982633   0.126045  -0.034317
   0.126045   0.085177   0.249068
  -0.034317   0.249068   0.932189

> A* pinv(A)
ans =
   0.982633   0.126045  -0.034317
   0.126045   0.085177   0.249068
  -0.034317   0.249068   0.932189
4 голосов
/ 15 февраля 2011

Я думаю, что декомпозиция LU более эффективна, чем инверсия (и потенциально более стабильна, если вы используете поворот). Это работает особенно хорошо, если вам нужно найти более одного правого бокового вектора, потому что, получив декомпозицию LU, вы можете выполнять прямую обратную подстановку для каждой по мере необходимости.

Я бы порекомендовал разложение LU по полному инверсному. Я согласен, если это то, что говорит MATLAB.

ОБНОВЛЕНИЕ: матрица 3х3? Вы можете инвертировать это вручную в закрытом виде, если вам это нужно. Просто сначала проверьте определитель, чтобы убедиться, что он не является единственным или почти единственным.

3 голосов
/ 23 сентября 2015

Если вам нужно только обратное, то просто сделайте, это будет численно более стабильно, чем inv (A):

inv_A = 1\A;
0 голосов
/ 15 февраля 2011

Если не существует умного способа выполнить все ваши расчеты без явного формирования инверсии, тогда вы должны использовать функцию «inv». Конечно, вы можете решить линейную систему с помощью своей матрицы и матрицы тождеств, но при этом ничего не получится.

...