我在线性代数上非常糟糕,我在构建循环时难以置信地将两个压缩矩阵相乘而不扩展它们并包括零。
例如,
0 1 2 3 * 10 11 12 13
0 4 5 6 0 14 15 16
0 0 7 8 0 0 17 18
0 0 0 9 0 0 0 19
实际上只是
a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
b = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19}
我最初有
for(i = 0; i < r1; ++i)
for(j = 0; j < c2; ++j)
for(k = 0; k < c1; ++k)
{
*(mult(i * cols) + j) += *(a(i * cols) + k) * (b + (k * cols) + j;
}
但这明显超出范围,因为它构建为就像它们是2D数组一样,当每个数组的大小只有10个元素时,它会变为16。
我观察到对角线只是对角线上元素的乘积,所以例如c [4] = a [4] * b [4]。我也明白,对于第一行,你乘以与列相同数量的术语,第二行乘以许多术语 - 1等等。
但除此之外,我对如何构建实际代码感到很遗憾。任何帮助是极大的赞赏。
答案 0 :(得分:1)
这是非常简单的编程。要将两个矩阵相乘,第一个矩阵的列数必须与第二个矩阵的行数相同。
例如,如果A是M X N矩阵而B是N X P矩阵,则乘法有效。乘法的结果是M×P矩阵。在您的示例中,矩阵是正方形且大小相同,因此乘法有效。
在任何情况下,你最终会得到第三个矩阵,称之为C,大小为4 X 4.
假设矩阵总是是上三角形,您可以减少将C矩阵初始化为所有0个元素然后仅处理上三角形部分所需的计算次数。类似下面的内容(假设已经定义并初始化了A,B和C矩阵):
double dummy;
int i, j, k;
int mRows, nCols, pCols; // Number of rows of A, and columns of B and C
for (k = 0; k < mRows; ++k) { // Do each row of A with each column of B
for (i = 0; i < pCols; ++i) {
dummy = 0.0;
for (j = 0; j <= i; ++j) dummy += A_Matrix[k][j]*B_Matrix[j][i];
C_Matrix[k][i] = dummy;
} // End for i
} // End for k
如果你想进一步减少计算次数,如果你知道A矩阵的第一列总是将为0,你可以在第一个元素上启动循环而不是第0个元素。即,
for (k = 0; k < mRows; ++k) { // Do each row of A with each column of B
for (i = 1; i < pCols; ++i) {
dummy = 0.0;
for (j = 1; j < nCols; ++j) dummy += A_Matrix[k][j]*B_Matrix[j][i];
C_Matrix[k][i] = dummy;
} // End for i
} // End for k
我认为解决这个问题的最简单方法是使用常规矩阵表示法。尝试扩展它,就像你已经完成的那样,只会使它复杂化,我认为你是在自己的脚下拍摄。