Python инверсия матрицы - PullRequest
       32

Python инверсия матрицы

57 голосов
/ 17 октября 2008

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

Ответы [ 6 ]

101 голосов
/ 17 октября 2008

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

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 , который является гораздо более эффективной реализацией списков, когда вам приходится иметь дело только с одним типом данных.

53 голосов
/ 19 октября 2008

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

См. Не инвертируйте эту матрицу .

10 голосов
/ 28 июня 2010

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

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

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

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

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

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

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

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

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

OldAl.

6 голосов
/ 03 марта 2009

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

Вот краткое руководство

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

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

5 голосов
/ 15 января 2014

Numpy подойдет для большинства людей, но вы также можете сделать матрицы в Sympy

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

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

Для развлечения попробуйте M**(1/2)

1 голос
/ 18 октября 2008

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

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

...