Question

Comment obtenir l'inverse d'une matrice en python? Je l'ai mis en œuvre moi-même, mais c'est du pur python et je suppose qu'il existe des modules plus rapides pour le faire.

Était-ce utile?

La solution

Vous devriez consulter numpy si vous effectuez une manipulation de matrice. Il s’agit d’un module principalement écrit en C, ce qui sera beaucoup plus rapide que la programmation en python pur. Voici un exemple montrant comment inverser une matrice et effectuer d’autres manipulations de 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.

Vous pouvez également consulter le module array , qui est un implémentation beaucoup plus efficace des listes lorsque vous devez traiter avec un seul type de données.

Autres conseils

Assurez-vous que vous avez vraiment besoin d'inverser la matrice. Ceci est souvent inutile et peut être numériquement instable. Lorsque la plupart des gens demandent comment inverser une matrice, ils veulent vraiment savoir comment résoudre Ax = b où A est une matrice et x et b sont des vecteurs. Il est plus efficace et plus précis d'utiliser un code qui résout l'équation Ax = b pour x directement que de calculer l'inverse puis de multiplier l'inverse par B. Même si vous devez résoudre Ax = b pour de nombreuses valeurs b, ce n'est pas une bonne idée. Pour inverser A. Si vous devez résoudre le système pour plusieurs valeurs b, enregistrez la factorisation de Cholesky de A mais ne l'inversez pas.

Voir Ne pas inverser cette matrice .

Il est dommage que la matrice choisie, répétée ici à nouveau, soit singulière ou mal conditionnée:

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

Par définition, l’inverse de A multiplié par la matrice A doit lui-même donner une matrice unitaire. Le A choisi dans l'explication tant louée ne fait pas cela. En fait, il suffit de regarder l'inverse pour indiquer que l'inversion n'a pas fonctionné correctement. Regardez la magnitude des termes individuels - ils sont très, très gros comparés aux termes de la matrice A originale ...

Il est remarquable que les humains, lorsqu'ils choisissent un exemple de matrice, parviennent si souvent à choisir une matrice singulière!

J’ai eu un problème avec la solution, j’ai donc cherché plus avant. Sur la plate-forme ubuntu-kubuntu, le paquet debian numpy ne contient ni la matrice ni les sous-paquets linalg. Par conséquent, outre l'importation de numpy, scipy doit également être importé.

Si les termes diagonaux de A sont multipliés par un facteur suffisamment grand, disons 2, la matrice cessera très probablement d'être singulière ou presque singulière. Donc

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

ne devient ni singulier ni presque singulier et l’exemple donne des résultats significatifs ... Lorsqu’il s’agit de nombres flottants, il faut être vigilant quant aux effets d’erreurs d’arrondissements inévitables.

Merci pour votre contribution,

OldAl.

Vous pouvez calculer le déterminant de la matrice qui est récursive puis formez la matrice adjacente

Voici un court tutoriel

Je pense que cela ne fonctionne que pour les matrices carrées

Une autre façon de les calculer consiste à orthogonaliser gram-schmidt, puis à transposer la matrice, la transposition d’une matrice orthogonisée est son inverse!

Numpy conviendra à la plupart des utilisateurs, mais vous pouvez également créer des matrices dans Sympy

Essayez d'exécuter ces commandes à l'adresse http://live.sympy.org/

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

Pour vous amuser, essayez M ** (1/2)

Si vous détestez numpy, sortez RPy et votre copie locale de R et utilisez-le à la place.

(Je voudrais également dire que vous devez vraiment inverser la matrice. En R, par exemple, linalg.solve et la fonction resol () ne font pas une inversion complète, car ce n'est pas nécessaire.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top