Julia 中的矩阵乘法逆舍入误差

标签 matrix precision julia matrix-multiplication matrix-inverse

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/

相关文章:

c - 最大尺寸方子矩阵

c++ - 多维数据集未显示为多维数据集

Java 浮点精度问题

numpy - 设置所有标量和数组的统一 Numpy dtype(如何避免精度下降)

julia - 如何在 Julia 0.5 中获取 Pkg? ("ERROR: unknown package Pkg")

r - %*%+ 在矩阵运算中是什么意思?

image - 将 Image 对象转换为 rgb 像素数组并在 Flutter 中返回

math - float 学有问题吗?

dataframe - 如何在 Julia 中将 GroupedDataFrame 转换为 DataFrame?

struct - Julia:修改可变结构数组中的相同字段