2016-07-15 141 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]); 
     } 
    } 
}