0

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

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

5 回答 5

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),所以在你的情况下,一个矩阵只有在它是正方形的时候才能被平方(he he he)。

如果你只是想玩一点矩阵,那么你可以试试 Octave,例如;对矩阵求平方就像M*Mor一样简单M**2

于 2009-07-22T20:00:10.910 回答
8

我认为您不能将矩阵本身相乘。

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 ) 算法),您仍然需要额外的存储空间。

于 2009-07-22T20:09:24.010 回答
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 是 amxs 矩阵,b 是 sxn,结果是 amxn,下标以 1..

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

于 2009-07-22T20:13:22.083 回答
0

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

于 2009-07-22T20:00:56.120 回答
0

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

于 2009-07-22T20:03:54.880 回答