2008-10-17 13 views
55

Как получить обратную матрицу в python? Я реализовал его сам, но это чистый питон, и я подозреваю, что для этого есть более быстрые модули.Python Обратная матрица

+0

пожалуйста, вы можете показать свой алгоритм? – 2016-12-23 12:05:22

+0

есть ответ здесь, если кому-то нужен фрагмент кода https://stackoverflow.com/questions/32114054/matrix-inversion-without-numpy – Alex 2017-09-30 10:20:24

ответ

99

Вы должны взглянуть на numpy, если вы выполняете манипуляции с матрицами. Это модуль, в основном написанный на C, который будет намного быстрее, чем программирование на чистом питоне. Вот пример того, как инвертировать матрицу и выполнять другие манипуляции с матрицами.

from numpy import matrix 
from numpy import linalg 
A = matrix([[1,2,3],[11,12,13],[21,22,23]]) # Creates a matrix. 
x = matrix([[1],[2],[3]])     # Creates a matrix (like a column vector). 
y = matrix([[1,2,3]])      # Creates a matrix (like a row vector). 
print A.T         # Transpose of A. 
print A*x         # Matrix multiplication of A and x. 
print A.I         # Inverse of A. 
print linalg.solve(A, x)  # Solve the linear equation system. 

Вы также можете посмотреть на модуль array, который является гораздо более эффективной реализации списков, когда вам приходится иметь дело только с одним типом данных.

+0

numpy также представлен в книге «Красивый код». :-) – Deestan 2008-10-17 07:35:21

+3

Обратите внимание также, что инверсии не происходит, и что система решается напрямую, как ответ Джона Д. Кука. – 2008-10-26 16:12:39

+0

Рассмотрите возможность использования numpy [массивы вместо матриц] (https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html#array-or-matrix-which-should-i -использование). Наряду с [`numpy.linalg`] (https://docs.scipy.org/doc/numpy/reference/routines.linalg.html) вы можете получить практически все, что захотите, без использования громоздкого` numpy.matrix `. – Praveen 2017-06-13 02:38:17

1

Если вы ненавидите numpy, выбирайте RPy и свою локальную копию R и используйте вместо этого.

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

+3

Никогда не использовался R, но почему внешняя программа и ее связующее на питоне лучше, чем самый известный научный пакет python? – 2012-08-16 14:25:11

52

Убедитесь, что вам действительно нужно инвертировать матрицу. Это часто не нужно и может быть численно неустойчивым. Когда большинство людей спрашивают, как инвертировать матрицу, они действительно хотят знать, как решить Ax = b, где A - матрица, а x и b - векторы. Более эффективно и точнее использовать код, который решает уравнение Ax = b для x непосредственно, чем для вычисления A, а затем умножить обратное на B. Даже если вам нужно решить Ax = b для многих значений b, это не очень хорошая идея инвертировать A. Если вам нужно решить систему для нескольких значений b, сохраните факторизацию Cholesky A, но не инвертируйте ее.

См. Don't invert that matrix.

6

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

Here is a short tutorial

Я думаю, что это работает только для квадратных матриц

Другой способ вычисления этих включает грамм -шмидт-ортогонализация, а затем транспонирование матрицы, транспонирование ортогонализованной матрицы является ее обратным!

10

Жаль, что выбранная матрица, повторяется здесь, либо единственном или плохо кондиционером:

A = matrix([[1,2,3],[11,12,13],[21,22,23]]) 

По определению, обратная А при умножении на самой матрицы А должен дать единичную матрицу , А, выбранный в очень похваляемом объяснении, этого не делает. Фактически, просто глядя на инверсию дает ключ к выводу, что инверсия не работает правильно. Посмотрите на величину отдельных терминов - они очень, очень большие по сравнению с терминами исходной матрицы A ...

Замечательно, что люди при выборе примера матрицы часто выбирают особая матрица!

У меня возникла проблема с решением, поэтому мы рассмотрели его дальше. На платформе ubuntu-kubuntu пакет numian debian не имеет матрицы и подпакетов linalg, поэтому в дополнение к импорту numpy необходимо также импортировать scipy.

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

A = matrix([[2,2,3],[11,24,13],[21,22,46]]) 

становится ни сингулярным, ни почти единственным и пример дает значимые результаты ... При работе с числами с плавающими один должен быть бдительной для эффектов inavoidable ошибки округления.

Спасибо за ваш вклад,

OldAl.

5

Numpy будет подходящим для большинства людей, но вы также можете сделать matrices in Sympy

Попробуйте запустить эти команды в http://live.sympy.org/

M = Matrix([[1, 3], [-2, 3]]) 
M 
M**-1 

Для удовольствия, попробуйте M**(1/2)