2016-11-17 137 views
1

:當我比較兩個MATLAB和C#下面的示例中的最終結果這個問題是有關my previous question here on Matrix right division矩陣乘法錯誤

,我注意到,有一個明顯的區別。這是爲什麼?

找到矩陣求逆的結果似乎相當,但A * A^-1似乎沒有辦法。

實施例在MATLAB:在C#

>> a = [1 2 3; 4 5 6; 7 8 10] 

a = 

    1  2  3 
    4  5  6 
    7  8 10 
>> inv(a) 

ans = 

    -0.6667 -1.3333 1.0000 
    -0.6667 3.6667 -2.0000 
    1.0000 -2.0000 1.0000 
>> z = mtimes(a, inv(a)) 
>> z 

z = 

    1.0000e+00 -4.4409e-16 -1.1102e-16 
    1.3323e-15 1.0000e+00 -2.2204e-16 
    2.2204e-15 -2.6645e-15 1.0000e+00 

相同的數據: using CSML Matrix Library

//using CSML Matrix Library 
public static Matrix operator *(Matrix A, Matrix B) 
{ 
    if (A.ColumnCount != B.RowCount) 
    throw new ArgumentException("Inner matrix dimensions must agree."); 
    Matrix C = new Matrix(A.RowCount, B.ColumnCount); 

     for (int i = 1; i <= A.RowCount; i++) 
     { 
      for (int j = 1; j <= B.ColumnCount; j++) 
      { 
       C[i, j] = Dot(A.Row(i), B.Column(j)); 
      } 
     } 

    return C; 
} 
Console.WriteLine(e1); 
1;  2;  3;  \ 
4;  5;  6;  \ 
7;  8;  10;  \ 

Console.WriteLine(e1.Inverse()); 
-0.666666666666667;  -1.33333333333333;  1;  \ 
-0.666666666666669;  3.66666666666667;  -2;  \ 
1;  -2;  1;  \ 

Console.WriteLine(e1 * e1.Inverse()); 
0.999999999999999;  1.77635683940025E-15; -8.88178419700125E-16; \ 
-5.32907051820075E-15; 1.00000000000001;  -3.5527136788005E-15; \ 
-1.06581410364015E-14; 3.5527136788005E-15; 0.999999999999996;  \ 
+2

差異似乎非常小 - 按機器精度順序,「eps(1)」。即使逆算法的實現方式相同,仍然使用兩種完全不同的語言/編譯器,並且在浮點運算時應該會出現這種差異。 – horchler

回答

2

兩個結果似乎合理的。 MATLAB使用行歸約計算inv(A)。減少行的每個步驟都會導致數值誤差(MATLAB將1/3解釋爲小數點位數有限的小數)。所以,由於數字錯誤,我預計inv(A)的元素將被關閉10^{ - 16}。該

一個* INV(A)=結果1 +/- 10^{ - 16}沿對角線和

一個* INV(A)= +/- 10^{ - 16}沿着非對角線

a*inv(a)一致等於單位矩陣加或減一些數值誤差。