2011-07-24 119 views
0

我知道有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:你應該發佈一些產生這種意外行爲的代碼,這樣我們就可以理解爲什麼了。 –

回答

2

除了預期的大輸出值(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

1

我無法解釋缺乏對稱性,但數量的大小是我所期望的。當你乘上矩陣時,你從第一列中抽取一行內部產品。由於您的行數爲50個元素,且您的元素在50-200範圍內,因此輸出矩陣中的元素大約爲50 * 100 * 100 = 500000。

+0

有趣..感謝指出,..我試着重新排列它的另一種方式 – StuckInPhD