2015-05-31 39 views
0

在朱莉婭:我在Julia的矩陣乘法中犯了什麼錯誤?

In [1]: M1 = [1 3 4; 
       45 64 33; 
       456 3 454;] 

Out [1]: 3x3 Array{Int64,2}: 
    1 3 4 
    45 64 33 
456 3 454 

In [2]: M1 * inv(M1) 

Out [2]: 3x3 Array{Float64,2}: 
    1.0   6.93889e-18 -8.67362e-19 
    0.0   1.0   -2.08167e-17 
-1.42109e-14 -8.88178e-16 1.0   

M1 * INV(M1)應該定義獲得單位矩陣。怎麼了?

我想同樣的事情在Matlab:

>> M1 = [1 3 4; 
     45 64 33; 
     456 3 454;] 
M1 = 
    1  3  4 
    45 64 33 
    456  3 454 
>> inv(M1) 
ans = 
    -0.280088987764182 0.013057987135465 0.001518595540939 
    0.052057842046719 0.013251438796731 -0.001421869710306 
    0.280978865406007 -0.013203075881414 0.000686753397495 
>> M1 * inv(M1) 
ans = 
    1.000000000000000 0.000000000000000 -0.000000000000000 
        0 1.000000000000000 -0.000000000000000 
    -0.000000000000014 -0.000000000000001 1.000000000000000 
>> 

Matlab的位置返回正確的結果。我想茱莉亞在這裏不會犯錯。那麼我的計算/符號有什麼問題?

編輯

該問題通過在浮點結果位數引起的。我應該問,如何在Julia中設置結果數字精度?

+0

相關問題:http://stackoverflow.com/questions/27786864/why-am-i-getting-incorrect-results-for-these-simple-operations-in-julia –

回答

0

朱莉婭和Matlab實際上給了相同的結果 (例如,左下元素是在這兩種情況下-1.4E-14): 它是不完全的單位矩陣,因爲浮點運算的說法並不確切。

你可以明確的輪顯示它之前的結果。

M1 = [ 
    1 3 4; 
    45 64 33; 
    456 3 454 
] 
round(M1 * inv(M1), 6) 
# 3x3 Array{Float64,2}: 
# 1.0 0.0 -0.0 
# 0.0 1.0 -0.0 
# 0.0 -0.0 1.0 

如果你想要一個確切的結果,你也可以使用有理數。

M1 = [ 
    1//1 3 4; 
    45 64 33; 
    456 3 454 
] 
M1 * inv(M1) 
# 3x3 Array{Rational{Int64},2}: 
# 1//1 0//1 0//1 
# 0//1 1//1 0//1 
# 0//1 0//1 1//1 
+0

謝謝。我應該更多地瞭解浮點數。 – Nick

+0

的浮點運算通常引用 [什麼每臺計算機科學家應該知道關於浮點運算(http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) ( D.Goldberg,1991), ,但是我發現了 [實際上準確的浮點數學](http://jeapostrophe.github.io/home/static/tm-cise2014.pdf) (N。Toronto and J. McCarthy ,2014) 更易於閱讀。 –

+0

的'實際上準確的浮點Math'看起來很整齊,作者約​​翰·麥卡錫在計算機科學領域的知名。絕對是一個很好的閱讀!謝謝! – Nick