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/

10-15 08:40