julia> A = [1 2; 3 4]
2x2 Array{Int64,2}:
1 2
3 4
julia> A * inv(A)
2x2 Array{Float64,2}:
1.0 0.0
8.88178e-16 1.0
为什么左下角的结果是
8.88178e-16
而不是右上角的 0.0
?我如何执行操作才能得到 [1.0 0.0; 0.0 1.0]
作为结果。有没有办法根据需要显示结果,但实际上象征性地执行矩阵运算,就像在 muPad 或其他一些符号评估器中一样?
最佳答案
正如评论中提到的,最好的方法是使用 Rational 类型。例如, A = Rational{Int}[1 2;3 4]
,使用 A*float(inv(A))
获得所需格式的输出。感谢@mschauer。
稍微说明一下,通常用于计算的浮点数精度有限,不能表示所有实数。因此,在使用浮点数进行操作时,您会遇到这些类型的错误。有关此问题的详细信息,请参阅评论中的链接。
然而,Julia 可以很容易地定义其他数字类型,并根据需要对它们进行操作。其中之一是有理数类型,它可以精确地表示分数。我们可以创建数组作为有理数:julia> A = Rational{Int}[1 2;3 4]2x2 Array{Rational{Int64},2}: 1//1 2//1 3//1 4//1
然后,对该数组的操作将返回精确的有理结果julia> A*(inv(A))2x2 Array{Rational{Int64},2}: 1//1 0//1 0//1 1//1
如果我们希望结果为浮点数,则可以在计算结束时对其进行转换。julia> float(A*(inv(A)))2x2 Array{Float64,2}: 1.0 0.0 0.0 1.0
需要注意的是,默认情况下使用浮点数的原因是性能。 CPU 针对浮点数进行了优化,使用上面的有理数会慢得多。但是,Julia 为您提供了工具,让您可以根据自己的需要自行做出选择。
关于Julia 中的矩阵乘法逆舍入误差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32877643/