Питон обратной матрицы


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

6 55

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 () на самом деле не делают полной инверсии, так как это не нужно.)