Python, обратный Матрице

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

6 ответов


вы должны взглянуть на включает в себя Если вы делаете матричные манипуляции. Это модуль, написанный в основном на 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.

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


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

посмотреть не инвертируйте эту матрицу.


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

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

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

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

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

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

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

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

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

OldAl.


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

вот краткий учебник

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

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


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

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

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

Для начала, попробовать M**(1/2)


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

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