2011-07-24 3 views
0

Je sais qu'il ya 3 façons de multiplier les matrices dans OpenCV, on est:La multiplication matricielle est-elle incorrecte dans opencv?

cvGEMM(M1, M1T, 1, NULL, 0, Mult, 0); 

l'autre:

cvMulTransposed(M1, Mult, 0); 

et troisième:

cvMul(M1, M1T, Mult); 

Je multiplient essentiellement un matrice par sa transposition. Après la multiplication des matrices doivent être symétriques .. mais chacune des méthodes ci-dessus me donne une sortie dissymétrique et complètement faux .. voici la matrice originale (M1):

rows: 5 
    cols: 50 
    dt: f 
    data: [ 60., 89., 86., 102., 58., 51., 143., 187., 140., 64., 80., 
     169., 184., 172., 67., 90., 174., 191., 175., 41., 97., 86., 171., 
     104., 87., 145., 164., 176., 157., 119., 176., 177., 180., 179., 
     150., 44., 182., 148., 182., 38., 48., 197., 171., 171., 39., 48., 
     169., 163., 141., 39., 93., 149., 169., 184., 56., 120., 166., 
     182., 168., 144., 132., 172., 187., 173., 157., 164., 157., 152., 
     166., 172., 175., 157., 133., 170., 140., 180., 164., 173., 175., 
     152., 178., 176., 166., 143., 158., 177., 186., 172., 138., 141., 
     182., 191., 169., 159., 34., 185., 154., 155., 171., 32., 81., 
     154., 163., 112., 52., 126., 163., 183., 165., 53., 136., 176., 
     184., 174., 51., 148., 173., 178., 139., 160., 158., 147., 163., 
     154., 135., 146., 157., 181., 161., 79., 39., 172., 187., 174., 
     45., 44., 187., 153., 173., 39., 46., 187., 145., 160., 36., 38., 
     177., 155., 150., 37., 81., 154., 163., 112., 52., 126., 163., 
     183., 165., 53., 136., 176., 184., 174., 51., 148., 173., 178., 
     139., 160., 158., 147., 163., 154., 135., 146., 157., 181., 161., 
     79., 39., 172., 187., 174., 45., 44., 187., 153., 173., 39., 46., 
     187., 145., 160., 36., 38., 177., 155., 150., 37., 76., 165., 
     195., 110., 100., 131., 180., 188., 184., 73., 146., 179., 193., 
     183., 96., 117., 148., 146., 185., 97., 104., 147., 157., 174., 
     172., 129., 171., 177., 181., 173., 123., 126., 186., 194., 171., 
     91., 74., 109., 194., 145., 33., 117., 166., 180., 176., 35., 77., 
     155., 152., 177. ] 

mais multipliant par sa transposition donne cette :

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. ] 

les valeurs sont asymétriques, aussi comment ils sont devenus si grand est ce que je ne comprends pas? CvMultransposed et cvGEMM donnent le même résultat que copié ci-dessus. CvMul donne une erreur d'exécution et retourne des valeurs de garbage. Aucune suggestion?

+0

La plupart du temps que je trouve un "mauvais" résultat, c'est parce que je ne comprenais pas l'API ou à quoi ressemblerait la bonne réponse. Un bogue dans un logiciel disponible publiquement est moins probable. Une grande base d'utilisateurs garantit presque que quelqu'un d'autre aurait repéré le bug avant que je l'ai fait et l'ai réparé. Je suis presque certain que le problème est avec vous, votre compréhension et votre code. – duffymo

+0

Je ne dis pas que c'est un bug, et je suis sûr que c'est une erreur de ma part, mais j'y ai travaillé toute la journée et je n'ai pas pu réparer, c'est pourquoi j'ai demandé de l'aide et des suggestions ici. – StuckInPhD

+0

@Faraz Khan: Vous devriez poster du code qui génère ce comportement inattendu afin que nous puissions comprendre pourquoi. –

Répondre

2

En plus des grandes valeurs de sortie attendues (dont japreiss vous a déjà parlé), la matrice que vous obtenez est symétrique.

Je l'ai aligné pour une meilleure lisibilité:

reshape(a,5,5) 

ans = 

     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 

Donc, il n'y a rien de mal ici, et vous devez double vérifier que X est en effet le cas si vous allez demander pourquoi X se produit à l'avenir ...

+0

Merci beaucoup de souligner cela .. Je pense que je regarde le problème dans le mauvais sens .. Je travaille sur la normalisation des valeurs .. peut-être que cela réglerait mes problèmes. Aussi pouvez-vous s'il vous plaît dites-moi comment vous avez ré-alligned la matrice? Je pensais que reshape ne pouvait fonctionner que dans ce format: 'cvReshape (mat, & row_header, 0, 1);' et avez-vous affiché la matrice dans le compilateur? Je pensais que cela ne pouvait être fait que lorsque nous utilisions cvSave lorsque nous voulions voir le contenu d'une matrice – StuckInPhD

+0

la reshape était purement à des fins d'affichage dans matlab (pas opencv) car j'ai entré les nombres comme une seule ligne. Je viens de prendre votre sortie de matrice (votre deuxième ligne) et l'a aligné à droite. – etarion

1

Je ne peux pas expliquer le manque de symétrie, mais l'ampleur des nombres est ce à quoi je m'attendais. Lorsque vous multipliez les matrices, vous prenez les produits internes d'une rangée du premier avec une colonne du second. Étant donné que vos lignes sont composées de 50 éléments et que vos éléments sont compris entre 50 et 200, cela représente environ 50 * 100 * 100 = 500 000 pour un élément de la matrice de sortie.

+0

intéressant .. merci de souligner que .. Ill essayer de réorganiser l'autre sens – StuckInPhD

Questions connexes