Python inversa de uma matriz
-
03-07-2019 - |
Pergunta
Como faço para obter o inverso de uma matriz em python? Eu tenho implementado por mim mesmo, mas é pura python, e eu suspeito que há mais rápido módulos lá fora, para fazê-lo.
Solução
Você deve ter um olhar para numpy se você fizer manipulação matriz. Este é um módulo escrito principalmente em C, que será muito mais rápido do que a programação em python puro. Aqui está um exemplo de como inverter uma matriz, e fazer outra manipulação matriz.
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.
Você também pode ter um olhar para o módulo matriz, que é um muito mais eficiente implementação de listas quando você tem que lidar com apenas um tipo de dados.
Outras dicas
Certifique-se de que você realmente precisa para inverter a matriz. Isso é muitas vezes desnecessário e pode ser numericamente instável. Quando as pessoas perguntam como inverter uma matriz, eles realmente querem saber como resolver Ax = b, onde A é uma matriz e x e b são vetores. É mais eficiente e mais preciso usar o código que resolve a equação Ax = b para x diretamente do que para calcular uma inversa em seguida, multiplicar o inverso por B. Mesmo se você precisa para resolver Ax = b para muitos valores b, não é uma boa idéia para inverter A. Se você tem que resolver o sistema para vários valores de b, salvar a fatoração de Cholesky de a, mas não invertê-lo.
É uma pena que a matriz escolhida, aqui repetida mais uma vez, é singular ou mal condicionado:
A = matrix( [[1,2,3],[11,12,13],[21,22,23]])
Por definição, a inversa de A quando multiplicado pela matriz em si A deve dar uma matriz de unidade. O A escolhida na explicação muito elogiado não faz isso. Na verdade apenas olhando para o inverso dá um indício de que a inversão não funcionou corretamente. Olhe para a magnitude dos termos individuais - eles são muito, muito grande em comparação com os termos do A matriz original ...
É notável que os seres humanos quando se escolhe um exemplo de uma matriz tantas vezes conseguem pegar uma matriz singular!
Eu não tenho um problema com a solução, então olhou para ele mais. Na plataforma ubuntu-Kubuntu, o numpy pacote debian não tem a matriz e o linalg sub-pacotes, portanto, além de importação de numpy, necessidades SciPy a ser importado também.
Se os termos diagonais de A são multiplicados por um fator bastante grande, digamos 2, a matriz provavelmente irá deixar de ser singular singular ou próximo. Então
A = matrix( [[2,2,3],[11,24,13],[21,22,46]])
torna-se nem singular, nem quase singular eo exemplo dá resultados significativos ... Quando se lida com números flutuantes é preciso estar atento para os efeitos da rodada inavoidable off erros.
Obrigado por sua contribuição,
oldal.
Você poderia calcular o determinante da matriz que é recursiva e depois formar a contíguo matriz
Eu acho que isso só funciona para matrizes quadradas
Outra forma de calcular estes envolve Gram-Schmidt ortogonalização e depois transpor a matriz, a transposta de uma matriz ortogonal é o seu inverso!
Numpy será adequado para a maioria das pessoas, mas você também pode fazer matrizes em SymPy
Tente executar esses comandos em http://live.sympy.org/
M = Matrix([[1, 3], [-2, 3]])
M
M**-1
Para se divertir, tentar M**(1/2)
Se você odeia numpy, sair RPY e sua cópia local do R, e usá-lo em seu lugar.
(Também gostaria de eco para que se você realmente precisa para inverter a matriz. Em R, por exemplo, linalg.solve eo solve () função não realmente fazer uma inversão completa, uma vez que é desnecessário.)