2012-02-20 337 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