我得到了兩個矩陣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-
我得到了兩個矩陣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-
矩陣乘法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];
}
}
正確。但我還要補充一點。在最一般情況下,矩陣乘法包含3個循環(在這種情況下爲2個循環,因爲其中一個矩陣實際上是一個矢量)。這3個循環不必按照你所建議的順序嵌套,實際上有6個如何排列它們的方法。由於矩陣行通常在內存中隨之而來,因此選擇正確的循環排序可更有效地利用CPU緩存。通過重新排序這些循環,可以將矩陣乘以幾倍。當然這與大矩陣有關。 – valdo 2012-02-20 22:49:29
@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
好吧,謝謝你們! – 2012-02-20 23:07:40
也許'outputLayer [k]'或類似的東西。也許你應該切換循環;測試版本和配置文件。 – 2012-02-20 22:14:00
是的,我不得不切換。 – 2012-02-20 22:18:42
其含義並不是你*有*,而是兩種排序中的一種可能比另一種排序快得多。你只需要嘗試。 – 2012-02-20 22:21:18