2012-02-20 598 views
0

我得到了兩個矩陣W2和hiddenLayer,我想進行乘法運算。 W2尺寸的12x50和隱藏層尺寸的50x1。上述計算的正確代碼:矩陣的乘法

for(int h=0; h<50; h++){ 
     for(int k=0; k<12; k++){ 
     outputLayer += W2[k][h]*HiddenLayer[h]; 
     } 
} 

或者我必須首先考慮k-

+1

也許'outputLayer [k]'或類似的東西。也許你應該切換循環;測試版本和配置文件。 – 2012-02-20 22:14:00

+0

是的,我不得不切換。 – 2012-02-20 22:18:42

+0

其含義並不是你*有*,而是兩種排序中的一種可能比另一種排序快得多。你只需要嘗試。 – 2012-02-20 22:21:18

回答

2

矩陣乘法is defined as

C = AB ⇔ Ci,j = Σk=1..n Ai,k Bk,j for i,j = 1...n (in case of square matrices).

因此outputLayer是向量。由於HiddenLayer是一個矢量過,這是不是一個真正的矩陣乘法,但矩陣向量乘法,從而簡化上述公式:

b = Ax ⇔ bi = Σk=1..m Ai,k xk for i = 1...n (A is an n x m matrix).

因此,所有的所有的代碼應該是這樣

for(int row = 0; row < 12; row++){ 
    outputLayer[row] = 0; 
    for(int column = 0; column < 50; column++){  
     outputLayer[row] += W2[row][column]*HiddenLayer[column]; 
     } 
} 
+0

正確。但我還要補充一點。在最一般情況下,矩陣乘法包含3個循環(在這種情況下爲2個循環,因爲其中一個矩陣實際上是一個矢量)。這3個循環不必按照你所建議的順序嵌套,實際上有6個如何排列它們的方法。由於矩陣行通常在內存中隨之而來,因此選擇正確的循環排序可更有效地利用CPU緩存。通過重新排序這些循環,可以將矩陣乘以幾倍。當然這與大矩陣有關。 – valdo 2012-02-20 22:49:29

+0

@valdo:這是真實的,但是我想盡可能簡單的回答OP。如果你知道一個特定的矩陣總是在右邊,你甚至可以轉置矩陣並使用C [i] [j] + = A [i] [k] * B [j] [k]'。有許多方法可以加速矩陣 - 矩陣乘法,但漸近運行時間始終是O(n ^(2,807))(使用Strassen算法)或O(n^3)(使用順序乘法和加法)。如果你想:)可以隨意編輯答案。 – Zeta 2012-02-20 22:59:35

+0

好吧,謝謝你們! – 2012-02-20 23:07:40