你如何将矩阵乘以?

时间:2009-07-22 19:58:24

标签: c++ matrix matrix-multiplication

这是我到目前为止所做的,但我认为这不对。

for (int i = 0 ; i < 5; i++)
{
    for (int j = 0;  j < 5; j++)
    {
        matrix[i][j] += matrix[i][j] * matrix[i][j];
    }
}

5 个答案:

答案 0 :(得分:9)

建议:如果不是家庭作业,不要编写自己的线性代数例程,请使用许多同行评审的库。

现在,关于你的代码,如果你想按学期产品做一个术语,那么你做错了,你正在做的是为每个值分配它的正方形加上原始值(n*n+n(1+n)*n,无论你最喜欢什么)

但是如果你想在代数意义上做一个真实的矩阵乘法,记住你必须通过第二个矩阵列做第一个矩阵行的标量积(或者另一种方式,我现在不是很确定)... ...类似于:

for i in rows:
    for j in cols:
        result(i,j)=m(i,:)·m(:,j)

和标量产品“·”

v·w = sum(v(i)*w(i)) for all i in the range of the indices.

当然,使用此方法您无法使用该产品,因为您需要在接下来的步骤中覆盖您所覆盖的值。

另外,进一步解释Tyler McHenry的评论,作为不得不按列增加行数的结果,“内部维度”(我不确定这是否是正确的术语)矩阵必须匹配(如果Am x nBn x oA*Cm x o),那么在您的情况下,矩阵只有它是正方形才能被平方(他是他)。

如果你只是想用矩阵玩一下,那么你可以尝试Octave,例如;平方矩阵就像M*MM**2一样简单。

答案 1 :(得分:7)

我认为你不能在原地自行增加矩阵。

for (i = 0; i < 5; i++) {
    for (j = 0; j < 5; j++) {
        product[i][j] = 0;
        for (k = 0; k < 5; k++) {
            product[i][j] += matrix[i][k] * matrix[k][j];
        }
    }
}

即使您使用不太天真的矩阵乘法(即除此O(n 3 )算法之外的其他东西),您仍需要额外的存储空间。

答案 2 :(得分:6)

这不是我见过的任何矩阵乘法定义。标准定义是

for (i = 1 to m)
   for (j = 1 to n)
      result(i, j) = 0
      for (k = 1 to s)
         result(i, j) += a(i, k) * b(k, j)

以一种伪代码给出算法。在这种情况下,a是m x s矩阵,b是s x n,结果是m x n,下标以1开始。

请注意,将矩阵相乘会得到错误的答案,因为在使用之前你将覆盖值。

答案 3 :(得分:0)

我完成矩阵数学已经太久了(我只做了一点点,但是+=运算符取值为matrix[i][j]并添加到它matrix[i][j] * matrix[i][j]的值,我认为这不是你想要做的。

答案 4 :(得分:0)

看起来它正在做的是对行/列进行平方,然后将其添加到行/列。那是你想要的吗?如果没有,那就改变它。