2013-06-16 2 views
2

В Matlab функция inv() часто обескураживается из-за численной нестабильности (см. Раздел описания в http://www.mathworks.com/help/matlab/ref/inv.html). Предлагается заменить выражение как:Каков правильный (стабильный, эффективный) способ использования инверсии матрицы в numpy?

inv(A)*B 

(где А и В являются матрицами), с:

A\B 

Это становится критической, когда инвертированный матрица А близка к вырожденной.

Есть ли хороший способ написать это в numpy/scipy? (решал бы() работу?)

+7

Смотрите этот StackOverflow вопрос - [левый обратный в NumPy] (http://stackoverflow.com/questions/2250403/left-inverse-in-numpy-or-scipy) – mtadd

+1

'linalg.solve()' является правильный способ сделать это - см. http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.solve.html#numpy.linalg.solve. Я считаю, что он численно более стабилен, чем обратный (с использованием разложения LU). – Floris

ответ

1

Как уже упоминалось в комментариях, вам нужно использовать левый инверсный.

Это описано в this question.

Суммируя (imitatio, aemulatio):

  • Использование linalg.lstsq(A,y) в целом.
  • Вы можете использовать linalg.solve(A,y), если знаете, A отвечает требованиям условий.
Смежные вопросы