Наиболее эффективная инверсия матрицы в MATLAB

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

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

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

каков наиболее эффективный способ инвертирования?

4 ответов


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

теперь, если ваша матрица A фактически обратим, тогда pseudo inverse of 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

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

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

обновление: матрица 3x3? Вы можете инвертировать вручную в закрытом виде, если вам это нужно. Просто сначала проверьте определитель, чтобы убедиться, что он не является сингулярным или почти сингулярным.


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

inv_A = 1\A;

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