2011-07-21 3 views
1

est ici la matrice origial que je veux inverser:cvInvert() de la matrice renvoie 0 matrice? mais le retour des valeurs réelles dans Matlab

rows: 5 
    cols: 5 
    dt: f 
    data: [ 927321., 1014163., 923303., 923303., 947641., 1014163., 
     1260101., 1062130., 1062130., 1102823., 923303., 1062130., 
     1004488., 1004488., 990651., 923303., 1062130., 1004488., 
     1004488., 990651., 947641., 1102823., 990651., 990651., 1116004. ] 

et en utilisant cette ligne pour inverser la matrice ci-dessus:

cvInvert(Mult, Inv, CV_LU); 

La matrice est revenu après inverse est-ce :

rows: 5 
    cols: 5 
    dt: f 
    data: [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0. ] 

et selon la documentation:

Dans le cas de la méthode LU, la fonction renvoie le déterminant src1 (src1 doit être carré). S'il vaut 0, la matrice n'est pas inversée et src2 est remplie de zéros.

Mais la chose étrange est que je demandé à mon ami de faire la même chose dans Matlab en utilisant cette même matrice et il retourne une matrice non nulle .. cela signifie que le facteur déterminant est non nul .. alors pourquoi OpenCV pense que le déterminant est nul?

Merci

+0

Risque de débordement? Ces chiffres sont assez gros, mais je ne suis pas familier avec la taille de la mémoire de float/double/nombres sur Opencv pour dire à coup sûr. –

Répondre

0

Selon un onduleur de matrice en ligne, l'inverse est:
0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000
0.000 0.000 68719476736.000 -68719476736.000 0.000
0.000 0.000 -68719476736.000 68719476736.000 0.000
0.000 0.000 0.000 0.000 0.000

C'est une matrice à la recherche très étrange et les autres termes sont très, très grand. Cela signifie que la calculatrice en ligne a des problèmes parce que le déterminant est si grand, votre routine déborde sur le déterminé en raison de la taille, ou les deux. Je serais prêt à parier que MatLab n'aura pas ce type de restrictions de taille, d'où la valeur valide de celui-ci.

+1

qu'est-ce que je normalise les valeurs? cela devrait réparer le débordement? de toute façon normaliser les valeurs dans opencv? – StuckInPhD

+0

La normalisation va changer votre inverse. Je me demande comment ou comment cette très grande matrice 5x5 est obtenue et peut-être si les valeurs qui arrivent pourraient être réduites? –

+0

cette matrice est obtenue en multipliant une matrice par sa transposition. J'ai mis à jour la question ci-dessus avec la matrice et la ligne que j'utilise pour les multiplier. Je suis d'avis que ma multiplicatin est en quelque sorte fausse .. – StuckInPhD

1

La matrice donnée est de rang déficient (le déterminant est zéro) et par conséquent vous ne pouvez pas calculer son inverse.