Подтвердить что ты не робот

Python Обратная матрица

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Жаль, что выбранная матрица, повторенная здесь снова, либо сингулярна, либо плохо обусловлена:
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]])

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

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

OldAl.

Ответ 4

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

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

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

Другой способ вычисления состоит в ортогонализации грамм-schmidt, а затем транспонировании матрицы, транспонирование ортогонализованной матрицы является ее обратным!

Ответ 5

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

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

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

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

Ответ 6

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

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