回答
你正在尋找的詞是顛簸。在Google yields more results中搜索顛簸矩陣乘法。
對於C的標準乘算法= A * B看起來像
void multiply(double[,] a, double[,] b, double[,] c)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++)
C[i, j] += a[i, k] * b[k, j];
}
基本上,在大步驟快速度導航存儲器是不利的性能。 B中的k的訪問模式正在完成該操作。因此,而不是在存儲跳來跳去,我們可能會重新安排操作,使得最內環僅在矩陣的第二存取操作指數:
void multiply(double[,] a, double[,] B, double[,] c)
{
for (i = 0; i < n; i++)
{
double t = a[i, 0];
for (int j = 0; j < n; j++)
c[i, j] = t * b[0, j];
for (int k = 1; k < n; k++)
{
double s = 0;
for (int j = 0; j < n; j++)
s += a[i, k] * b[k, j];
c[i, j] = s;
}
}
}
這是該網頁上給出的例子。但是,另一種方法是事先將B [k,*]的內容複製到數組中,並在內部循環計算中使用該數組。這種方法通常比替代方案快,即使它涉及複製數據。即使這看起來可能與直覺相反,請隨時嘗試一下。
void multiply(double[,] a, double[,] b, double[,] c)
{
double[] Bcolj = new double[n];
for (int j = 0; j < n; j++)
{
for (int k = 0; k < n; k++)
Bcolj[k] = b[k, j];
for (int i = 0; i < n; i++)
{
double s = 0;
for (int k = 0; k < n; k++)
s += a[i,k] * Bcolj[k];
c[j, i] = s;
}
}
}
@ Cesar的回答不正確。例如,內部循環
for (int k = 0; k < n; k++)
s += a[i,k] * Bcolj[k];
經過a的第i列。
以下代碼應確保我們總是按行訪問數據。
void multiply(const double (&a)[I][K],
const double (&b)[K][J],
const double (&c)[I][J])
{
for (int j=0; j<J; ++j) {
// iterates the j-th row of c
for (int i=0; i<I; ++i) {
c[i][j] = 0;
}
// iterates the j-th row of b
for (int k=0; k<K; ++k) {
double t = b[k][j];
// iterates the j-th row of c
// iterates the k-th row of a
for (int i=0; i<I; ++i) {
c[i][j] += a[i][k] * t;
}
}
}
}
你的代碼也是錯的。 c [i] [j]的重置可以是完全可選的(取決於調用者是否將矩陣重置爲零)。另外k上的循環從1開始,但應該從零開始。 – greywolf82
@ greywolf82 c [i] [j]需要重置,因爲「c [i] [j] + = a [i] [k] * t」的積累需要一個初始值。 「k從0開始」是正確的。固定。 –
是的,我知道,但是如果調用者將memset設置爲0,則不需要該循環。在你的代碼中添加一條評論來澄清。 – greywolf82
- 1. 相乘兩個矩陣
- 2. 相乘以矩陣
- 3. 相乘兩個非稀疏矩陣
- 4. 矩陣相乘兩個列表與式
- 5. 乘以矩陣的兩個元素
- 6. Matlab - 將矩陣乘以3D矩陣的每個矩陣
- 7. 在Java中乘以兩個矩陣
- 8. 在R中乘以兩個矩陣
- 9. 在R中乘以兩個矩陣
- 10. 在Julia中乘以兩個矩陣
- 11. 緩存友好的C++在C++中對矩陣進行操作?
- 12. 如何將兩個矩陣的列與所有組合相乘
- 13. 將矩陣乘以向量
- 14. 將矢量與矩陣的列相乘的最佳方法
- 15. 緩存不友好的循環超過緩存友好循環的2d陣列
- 16. 3D矩陣乘以2D矩陣的元素明智乘法
- 17. (emu8086)將3x3矩陣與陣列相乘
- 18. SSE矩陣,矩陣乘法
- 19. 矩陣乘法
- 20. 矩陣乘法
- 21. 矩陣乘法
- 22. 矩陣乘法
- 23. 使用管道將兩個矩陣相乘
- 24. 將矩陣的每列乘以另一個矩陣
- 25. 將兩個矩陣乘以一個矢量
- 26. 矩陣的乘法
- 27. 的矩陣乘法
- 28. N次方矩陣乘法.Better方法
- 29. 矩陣乘法與使用真相法
- 30. 緩存友好陣列迭代圖案
在你的第二個代碼塊'c [i,j] = s;',但似乎'j'沒有在該範圍內聲明。 –
我想知道爲什麼這是被接受的答案,K上的內部循環正在按列訪問,從性能角度看完全錯誤。 – greywolf82
該代碼假設一個類似C的語言,其中矩陣是行主要的。當使用'''a [i,j]''訪問以行優先順序存儲的矩陣時,如果你想要'''''''最大化性能。 – Cesar