Как получить обратную матрицу в python? Я сам реализовал его, но это чистый питон, и я подозреваю, что для этого есть более быстрые модули.
Python Обратная матрица
Ответ 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() фактически не выполняют полную инверсию, так как это необязательно.)