检查特征值是否等于实数的不同方法是什么?

时间:2015-09-23 03:21:43

标签: r complex-numbers eigenvalue

我有以下矩阵

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) < tolall.equalsignif。答案可以讨论这些选项吗?

2 个答案:

答案 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

通常会有解决方法导致相同的结果(roundsignif ...),但使用all.equal()是首选,因为它是一个旨在处理比较的函数浮点数,无需调整精度阈值或指定有效位数。

?Comparison中所述:

  

对于数值和复数值,请记住==和!=不允许分数的有限表示,也不允许舍入误差。使用all.equal与相同几乎总是可取的。

答案 1 :(得分:0)

您可能必须使用abs;这必须做浮点精度:

abs(Re(eigen(M)$values) - 1) < .001