我有以下矩阵
M <- structure(c(0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 1, 0), .Dim = c(5L, 5L))
我想找到正好为1的特征值。我认为这样可行:
Re(eigen(M)$values) == 1 & Im(eigen(M)$values) == 0
但Re(eigen(M)$values) == 1
并不认为第5个特征值等于1,即使它确实如此。我错过了什么?
编辑:一旦它被指出为浮点问题,我会进行更多调查并找出几个解决方案,包括使用abs(value) < tol
,all.equal
和signif
。答案可以讨论这些选项吗?
答案 0 :(得分:5)
在R中,在==
等比较的情况下处理浮点数的常用方法是使用函数all.equal()
。
您可能想尝试:
sapply(1:nrow(M), function(x) identical(all.equal(eigen(M)$values[x],1+0i),TRUE))
[1] FALSE FALSE TRUE FALSE TRUE
通常会有解决方法导致相同的结果(round
,signif
...),但使用all.equal()
是首选,因为它是一个旨在处理比较的函数浮点数,无需调整精度阈值或指定有效位数。
如?Comparison
中所述:
对于数值和复数值,请记住==和!=不允许分数的有限表示,也不允许舍入误差。使用all.equal与相同几乎总是可取的。
答案 1 :(得分:0)
您可能必须使用abs
;这必须做浮点精度:
abs(Re(eigen(M)$values) - 1) < .001