我得到了两个矩阵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