当两个参数为 true 时,R 返回 false 和 == [duplicate]

R is returning false with == when the two paramaters are true [duplicate]

提问人:ajax2112 提问时间:10/20/2019 更新时间:10/20/2019 访问量:644

问:

在这里,我有一个 3 x 3 矩阵,并计算了矩阵的行列式和矩阵转置的行列式(根据代码,它们应该是相同的),但是在比较它们以检查它们是否相等时,我得到的输出为 false。

如果我将值分配给其他变量并检查它们,也是如此。

这是我的代码:

matrixTest <- matrix(
  c(c(1,5,7),c(1,2,6),c(8,2,6)),
  ncol = 3,
)

det(matrixTest)
det(t(matrixTest))

det(matrixTest) == det(t(matrixTest))

运行此块时 R Studio 的输出:

> det(matrixTest)
[1] 112
> det(t(matrixTest))
[1] 112
> 
> det(matrixTest) == det(t(matrixTest))
[1] FALSE
R 矩阵 相等

评论

0赞 Jon Spring 10/20/2019
我怀疑与这里相同的问题:stackoverflow.com/questions/9508518/......
1赞 Jon Spring 10/20/2019
是的。尝试一下,您会发现这两个数字略有不同,由于浮点数的工作方式,会下降许多位数。在这种情况下,使用起来信息量更大,因为它允许数字的存储方式存在一些不精确性。sprintf("%.15f", det(matrixTest))sprintf("%.15f", det(t(matrixTest)))all.equal(det(matrixTest), det(t(matrixTest)))

答:

1赞 G. Grothendieck 10/20/2019 #1

这是由于浮点近似:

det(matrixTest) - det(t(matrixTest))
## [1] -9.947598e-14

用于比较两个对象是否在容差范围内相等。有关详细信息,请参阅。all.equal?all.equal

all.equal(det(matrixTest), det(t(matrixTest)))
## [1] TRUE

在这种特殊情况下,由于元素都是整数,我们知道结果必须是整数,因此另一个建议是将两边四舍五入:

round(det(matrixTest)) == round(det(t(matrixTest)))
## [1] TRUE

还有:zapsmall

zapsmall(det(matrixTest)) == zapsmall(det(t(matrixTest)))
## [1] TRUE

评论

0赞 ajax2112 10/20/2019
您是否知道我可以阅读有关 R 处理此类情况的方式的任何资源?了解如何在未来避免它。
0赞 G. Grothendieck 10/20/2019
这就是浮点在所有语言中的工作方式,而不仅仅是 R,因此任何关于浮点的一般讨论都应该这样做。也许维基百科的条目:en.wikipedia.org/wiki/Floating-point_arithmetic
0赞 Jon Spring 10/20/2019
请参阅我上面链接的问题中的信息性答案:stackoverflow.com/a/9508558/6851825