opencv中的矩阵乘法错误?

问题描述:

我知道有3种方式繁殖的OpenCV的矩阵,一个是:opencv中的矩阵乘法错误?

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

其他:

cvMulTransposed(M1, Mult, 0); 

和第三:

cvMul(M1, M1T, Mult); 

我基本上乘以矩阵的转置。相乘后矩阵应该是对称的..但上面的每个方法是给我的不对称和完全错误的输出..原来这里是(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. ] 

,而是由它的转置乘以这给本:

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

值是不对称的,他们还怎么有这么大的是什么,我不明白?

cvMultransposed和cvGEMM给出了与上面复制的结果相同的结果。cvMul给出了一些运行时错误并返回垃圾值。有什么建议么?

+0

大部分时间我发现一个“错误”的结果,这是因为我不理解API或正确的答案是什么样子。公开可用软件中的错误不太可能。一个庞大的用户群几乎可以确保别人在我做之前就已经发现了这个错误并修复了它。我几乎可以肯定,问题在于你,你的理解和你的代码。 – duffymo

+0

即时通讯并不是说它是一个错误,而且我确定它是我的一个错误,但是我整天都在努力修复它,所以我在这里寻求帮助和建议。 – StuckInPhD

+0

@Faraz Khan:你应该发布一些产生这种意外行为的代码,这样我们就可以理解为什么了。 –

除了预期的大输出值(japreiss已经告诉你的)之外,你得到的矩阵是对称的。

我对准它更好的可读性:

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 

所以,这里没有什么不对的,你应该仔细检查X的确是这样的,如果你去问问为什么X发生在未来...

+0

非常感谢指出了..我认为我看错误的方式..我正在努力正常化的价值..也许这会解决我的问题。你也可以告诉我你是如何重新分配矩阵的?我认为reshape只能以这种格式工作:'cvReshape(mat,&row_header,0,1);'..你在编译器中显示矩阵吗?我认为这只能在我们使用cvSave时才能完成,因为我们想要查看矩阵的内容 – StuckInPhD

+0

整形是纯粹用于matlab(不是opencv)的显示目的,因为我已经将数字作为一行输入。我只是把你的矩阵输出(你的第二行)并将其对齐。 – etarion

我无法解释缺乏对称性,但数量的大小是我所期望的。当你乘上矩阵时,你从第一列中抽取一行内部产品。由于您的行数为50个元素,且您的元素在50-200范围内,因此输出矩阵中的元素大约为50 * 100 * 100 = 500000。

+0

有趣..感谢指出,..我试着重新排列它的另一种方式 – StuckInPhD