矩阵乘法错在opencv?

时间:2011-07-24 20:47:11

标签: 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给出一些运行时错误并返回垃圾值。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

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

我已将其对齐以提高可读性:

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将来会发生......

答案 1 :(得分:1)

我无法解释缺乏对称性,但数字的大小是我所期望的。当你乘以矩阵时,你从第一行得到一行的内积,用第二列得到一列。由于您的行是50个元素,并且您的元素在50-200范围内,因此对于输出矩阵中的元素,这将大约为50 * 100 * 100 = 500000。