J'essaie de multiplier un vecteur (3 par 1) par sa transposition (1 par 3). Je reçois un tableau (3 par 3) mais je ne peux pas obtenir son inverse. Une idée pourquoi?
import numpy as np
c=array([1, 8, 50])
np.transpose(c[np.newaxis]) * c
array([[ 1, 8, 50],
[ 8, 64, 400],
[ 50, 400, 2500]])
np.linalg.inv(np.transpose(c[np.newaxis]) * c)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Python26\lib\site-packages\numpy\linalg\linalg.py", line 445, in inv
return wrap(solve(a, identity(a.shape[0], dtype=a.dtype)))
File "C:\Python26\lib\site-packages\numpy\linalg\linalg.py", line 328, in solve
raise LinAlgError, 'Singular matrix'
LinAlgError: Singular matrix
La matrice que vous avez collée
[[ 1, 8, 50],
[ 8, 64, 400],
[ 50, 400, 2500]]
A un déterminant de zéro. C'est la définition d'une matrice singulière (pour laquelle l'inverse n'existe pas)
Par définition, en multipliant un vecteur 1D par sa transposition, vous avez créé une matrice singulière.
Chaque ligne est une combinaison linéaire de la première ligne.
Notez que la deuxième ligne ne représente que 8 fois la première ligne.
De même, la troisième ligne est 50x la première ligne.
Il n'y a qu'une seule ligne indépendante dans votre matrice.
Comme cela a déjà été mentionné dans les réponses précédentes, votre matrice ne peut pas être inversée, car son déterminant est 0. Mais si vous souhaitez toujours obtenir une matrice inverse, vous pouvez utiliser np.linalg.pinv
, qui utilise SVD pour approcher la matrice initiale.