Inversion de matrice sans Numpy
Je veux inverser une matrice sans l'aide de numpy.linalg.inv.
La raison en est que je suis en utilisant Numba pour accélérer le code, mais numpy.linalg.inv n'est pas pris en charge, donc je me demande si je peux inverser une matrice avec des "classiques" du code Python.
Avec numpy.linalg.inv un exemple de code devrait ressembler à ça:
import numpy as np
M = np.array([[1,0,0],[0,1,0],[0,0,1]])
Minv = np.linalg.inv(M)
Probablement pas. Il n'y a pas de python "builtin" le faire pour vous et la programmation d'une inversion de matrice vous-même est tout sauf facile (voir par exemple en.wikipedia.org/wiki/... pour une liste (probablement non exhaustive de méthodes). Je suis pas au courant de tout
Si vous voulez inverser des matrices 3x3 seulement, vous pouvez consulter la formule ici. (Il vaut mieux spécifier la dimension et le type de matrices que vous souhaitez inverser. Dans votre exemple vous utilisez le plus trivial matrice d'identité. Sont-ils réels? Et régulier?)
Pour être précis, est une véritable matrice 4x4
numpy
indépendant de package d'algèbre linéaire pour python...Si vous voulez inverser des matrices 3x3 seulement, vous pouvez consulter la formule ici. (Il vaut mieux spécifier la dimension et le type de matrices que vous souhaitez inverser. Dans votre exemple vous utilisez le plus trivial matrice d'identité. Sont-ils réels? Et régulier?)
Pour être précis, est une véritable matrice 4x4
OriginalL'auteur Alessandro Vianello | 2015-08-20
Vous devez vous connecter pour publier un commentaire.
Ici est un plus élégant et d'une solution évolutive, de l'omi. Il va travailler pour toute matrice nxn et vous peuvent trouver une utilisation pour les autres méthodes. Notez que getMatrixInverse(m) dans un tableau de tableaux en entrée. N'hésitez pas à poser des questions.
#base case for 2x2 matrix
. vous avez besoin de convertir explicitement à flotteur.Si la matrice n'est pas carrée la fonction de transposition donnera une erreur, pour trouver le transposer pour une liste simplement que nous pouvons faire: zip(*theArray) Prises à partir de: stackoverflow.com/questions/4937491/matrix-transpose-in-python
vous avez raison, merci. Bien que non matrices carrées n'ont pas l'inverse, je ne demande ma réponse est composée de pièces réutilisables, donc j'ai corrigé la fonction de transposition à votre suggestion.
J'ai utilisé une partie de votre code avec une matrice non carrée pour trouver la matrice de projection, c'est pourquoi j'ai eu cette question. Merci
c'est formidable. Je souhaite que je pourrais upvote plus d'une fois
OriginalL'auteur stackPusher
Pour un 4 x 4 de la matrice, il est probablement juste sur OK pour utiliser la formule mathématique, que vous pouvez trouver à l'aide de Googler "formule de 4 par 4 de la matrice inverse". Par exemple ici (je ne peux pas se porter garant de son exactitude):
http://www.cg.info.hiroshima-cu.ac.jp/~miyazaki/knowledge/teche23.html
En général, l'inversion d'une matrice n'est pas pour les timides. Vous devez être conscient de tous les mathématiquement les cas difficiles et de savoir pourquoi ils ne s'appliquent à votre utilisation, et les attraper quand vous êtes fourni avec mathématiquement pathologique entrées (ou revenir aux résultats de la faible précision ou numérique ordures en sachant qu'il ne sera pas question dans votre cas d'utilisation à condition de ne pas parvenir à diviser par zéro ou de débordement MAXFLOAT ... que vous pourriez attraper avec un gestionnaire d'exception et de les présenter comme "Erreur: la matrice est singulière ou très proche de celle-ci").
Il est généralement meilleur en tant que programmeur pour utiliser la bibliothèque de code écrit par le numérique en mathématiques experts, sauf si vous êtes prêt à passer du temps à la compréhension de la physique et de la mathématique, de la nature du problème particulier qui vous vous adressez et de devenir votre propre mathématiques expert dans votre domaine d'expertise.
OriginalL'auteur nigel222
À tout le moins au 16 juillet 2018 Numba a un rapide de la matrice inverse. (Vous pouvez voir comment ils surcharge de la norme NumPy inverse et d'autres opérations ici.)
Voici les résultats de mon analyse comparative:
Pour les petites matrices, il est particulièrement rapide:
[Out]
Avis que l'accélération ne fonctionne que pour NumPy inverse, pas SciPy (comme prévu).
Légèrement plus grande de la matrice:
[Out]
Donc, il y a toujours un speedup ici, mais SciPy est en train de rattraper.
OriginalL'auteur webelo
J'ai utilisé la formule de http://cg.info.hiroshima-cu.ac.jp/~miyazaki/knowledge/teche23.html d'écrire la fonction qui fait l'inversion d'une matrice 4x4:
np.linalg.inv
maisnp.linalg.det
est bien? C'est une très maladroit exigence...Bien sûr, on a besoin d'écrire un autre "brute force" mise en œuvre pour le déterminant de calcul en tant que bien. Ou simplement calculer le det à l'extérieur de la Numba de la fonction et de la passer en argument
OriginalL'auteur Alessandro Vianello