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.

Foi útil?

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.

Não inverter essa matriz .

É 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

Aqui está um pequeno tutorial

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.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top