2016-07-15 98 views
-1

我不明白为什么下面的代码给出矩阵'u'的错误答案。矩阵'u'应该等于单位矩阵,但只有一些值是正确的。任何人都可以帮助我理解为什么会发生这种情况?矩阵乘法错误-

for (k=0; k<3; k++) { 

    int j; 
    for (j=0; j<3; j++) { 

     int h; 
     for (h=0; h<3; h++) { 


      u[k][j]+=(F[k][h])*(B[h][j]); 

     } 

    } 

} 

Matrix F 
2 -2.2 0.6 
-0 0.4 -0.2 
-3 3.2 -0.6 
Matrix B 
2 3 1 
3 3 2 
6 1 4 
Matrix u 
1 -4.44089e-16 0 
0 1 0 
8.88178e-16 1.33227e-15 1 
+1

有趣的“*代码是正确的,但答案是错误的*”;那么你认为会导致错误的输出? –

+0

我不会说像8.88178e-16这样的数字与零相同。但他们真的很小。所以可能会因为算术精度而出现错误 – infixed

+0

欢迎使用Stack Overflow!请**用[mcve]或[SSCCE(Short,Self Contained,Correct Example)](http://sscce.org)**您的问题 – NathanOliver

回答

0

你的数学是不工作了,你可能会想到办法的原因是因为您正在使用浮点数(Floating point numbers),而不是真正的“真正的”数字打交道。如果你想用漂浮或双打做精确的工作,那么你需要了解浮点数学。

如果你真的不关心精度,只想让东西看起来正确,那么快速解决方法是定义一个数字零点,并将其设置为小于实际零点。像1e-6这样的东西可以工作。一些示例代码如下。

for (int i = 0; i < 3; i++) 
    for (int j = 0; j < 3; j++) 
     u[i][j] = abs(u[i][j]) < 1e-6 ? 0 : u[i][j]; 
+0

这只是“修复”0.0但1.0有类似的问题。实际上0.573或其他任何数字也是如此。你猜不到。 – MSalters

0

初始化u[k][j]=0当你移动计算总和的u不同的元素。这应该很好。

for (k=0; k<3; k++) 
{ 
    int j; 
    for (j=0; j<3; j++) 
    { 
     int u[k][j]=0; 
     int h; 
     for (h=0; h<3; h++) 
     { 
      u[k][j]+=(F[k][h])*(B[h][j]); 
     } 
    } 
}