2015-05-31 36 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