Вопрос

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

Это было полезно?

Решение

Вам следует взглянуть на 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.

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

Другие советы

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

Видишь Не инвертируйте эту матрицу.

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

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

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

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

У меня действительно была проблема с решением, поэтому я изучил ее подробнее.На платформе ubuntu-kubuntu пакет debian numpy не имеет подпакетов matrix и 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() на самом деле не выполняют полную инверсию, поскольку в этом нет необходимости.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top