Domanda

Come posso ottenere l'inverso di una matrice in Python? L'ho implementato da solo, ma è puro Python e sospetto che ci siano moduli più veloci là fuori per farlo.

È stato utile?

Soluzione

Dovresti dare un'occhiata a numpy se esegui la manipolazione della matrice. Questo è un modulo scritto principalmente in C, che sarà molto più veloce della programmazione in puro pitone. Ecco un esempio di come invertire una matrice e fare altre manipolazioni della matrice.

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.

Puoi anche dare un'occhiata al modulo array , che è un implementazione molto più efficiente degli elenchi quando si ha a che fare con un solo tipo di dati.

Altri suggerimenti

Assicurati di aver davvero bisogno di invertire la matrice. Questo è spesso inutile e può essere numericamente instabile. Quando molte persone chiedono come invertire una matrice, vogliono davvero sapere come risolvere Ax = b dove A è una matrice e xeb sono vettori. È più efficiente e più accurato utilizzare il codice che risolve l'equazione Ax = b per x direttamente rispetto al calcolo di A inversa quindi moltiplica l'inverso per B. Anche se è necessario risolvere Ax = b per molti valori b, non è una buona idea per invertire A. Se devi risolvere il sistema per più valori b, salva la fattorizzazione di Cholesky di A, ma non invertirla.

Vedi Non invertire quella matrice .

È un peccato che la matrice scelta, ripetuta qui di nuovo, sia singolare o mal condizionata:

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

Per definizione, l'inverso di A quando moltiplicato per la matrice A stessa deve dare una matrice unitaria. L'A scelto nella spiegazione tanto elogiata non lo fa. In effetti, solo guardando l'inverso si ha la sensazione che l'inversione non ha funzionato correttamente. Guarda la grandezza dei singoli termini: sono molto, molto grandi rispetto ai termini della matrice A originale ...

È notevole che gli umani quando scelgono un esempio di matrice così spesso riescano a scegliere una matrice singolare!

Ho avuto un problema con la soluzione, quindi ho esaminato ulteriormente. Sulla piattaforma ubuntu-kubuntu, il pacchetto debian numpy non ha la matrice e i sotto-pacchetti linalg, quindi oltre all'importazione di numpy, è necessario importare anche scipy.

Se i termini diagonali di A vengono moltiplicati per un fattore abbastanza grande, diciamo 2, molto probabilmente la matrice cesserà di essere singolare o quasi singolare. Quindi

A = matrix( [[2,2,3],[11,24,13],[21,22,46]])

non diventa né singolare né quasi singolare e l'esempio dà risultati significativi ... Quando si ha a che fare con numeri fluttuanti, bisogna essere attenti agli effetti di errori di arrotondamento non disponibili.

Grazie per il tuo contributo,

Oldal.

È possibile calcolare il determinante della matrice ricorsiva e quindi formare la matrice adiacente

Ecco un breve tutorial

Penso che questo funzioni solo per matrici quadrate

Un altro modo di calcolare questi comporta l'ortogonalizzazione di Gram-Schmidt e quindi il recepimento della matrice, la trasposizione di una matrice ortogonale è il suo contrario!

Numpy sarà adatto alla maggior parte delle persone, ma puoi anche fare matrici in Sympy

Prova a eseguire questi comandi su http://live.sympy.org/

M = Matrix([[1, 3], [-2, 3]])
M
M**-1

Per divertimento, prova M**(1/2)

Se odi l'intorpidimento, esci da RPy e dalla tua copia locale di R, e usalo invece.

(Vorrei anche fare eco per farti davvero bisogno di invertire la matrice. In R, ad esempio, linalg.solve e la funzione di risoluzione () in realtà non fanno un'inversione completa, poiché non è necessaria.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top