Инверсия Python матрицы

59
задан Amro 3 July 2013 в 15:02
поделиться

5 ответов

Необходимо взглянуть на 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.

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

104
ответ дан Mapad 24 November 2019 в 18:02
поделиться

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

Видят , не инвертируют ту матрицу .

55
ответ дан John D. Cook 24 November 2019 в 18:02
поделиться

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

Вот короткое учебное руководство

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

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

6
ответ дан dbr 24 November 2019 в 18:02
поделиться

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

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

1
ответ дан Gregg Lind 24 November 2019 в 18:02
поделиться

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

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

По определению, обратная величина A при умножении на саму матрицу 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.

10
ответ дан 24 November 2019 в 18:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: