Необходимо взглянуть на 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.
Можно также взглянуть на модуль массива, который является намного более эффективным внедрением списков, когда необходимо иметь дело только с одним типом данных.
Удостоверьтесь, что действительно необходимо инвертировать матрицу. Это является часто ненужным и может быть численно нестабильным. Когда большинство людей спрашивает, как инвертировать матрицу, они действительно хотят знать, как решить Топор = b, где A является матрицей и x, и b являются векторами. Это более эффективно и больше с точностью до кода использования, который решает Топор уравнения = b для x непосредственно, чем вычислить, инверсия тогда умножают инверсию на B. Даже если необходимо решить Топор = b для многих значений b, это не хорошая идея инвертировать A. Если Вы должны решить систему для нескольких значений b, сохранить факторизацию Холесского A, но не инвертируете его.
Видят , не инвертируют ту матрицу .
Вы могли вычислить детерминант матрицы, которая является рекурсивной, и затем сформируйтесь, матрица, к которой примыкают
Вот короткое учебное руководство
, я думаю, что это только работает на квадратные матрицы
Другой способ вычислить, они включают ортогонализацию Грама-Шмидта и затем перемещение матрицы, транспонирование ортогонализируемой матрицы является своей инверсией!
Если Вы ненавидите numpy, вынимаете RPy и Вашу локальную копию R, и используете его вместо этого.
(я также отозвался бы эхом для создания Вас, действительно необходимо инвертировать матрицу. В R, например, linalg.solve и решении () функция на самом деле не делает полной инверсии, так как это является ненужным.)
Жаль, что выбранная матрица, повторенная здесь снова, либо сингулярна, либо плохо обусловлена:
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.