【问题标题】:Different ways to check whether an eigenvalue equals a real number?检查特征值是否等于实数的不同方法?
【发布时间】:2015-09-23 03:21:42
【问题描述】:

我有以下矩阵

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

【问题讨论】:

  • 可能是像here这样的浮动问题
  • 在我的电脑上,Re(eigen(M)$values)[5]0.9999999999999997779554options(digits = 22)
  • 因为format(Re(eigen(M)$values[c(3, 5)]), digits=22) [1] "1.0000000000000000000000" "0.9999999999999997779554"
  • 另一种方式可能是Re(eigen(M)$values) %%1 == 0 &amp; Im(eigen(M)$values) %% 1 == 0,即FALSE FALSE TRUE TRUE FALSE

标签: r complex-numbers eigenvalue


【解决方案1】:

在 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 几乎总是更可取的。

【讨论】:

  • 您能解释一下为什么这是 R 中的首选方式吗?
  • 但是结果不是错了吗?应该是FALSE FALSE TRUE TRUE FALSE
  • 它们看起来不错。根据我的电脑,第四个特征值是(-1+0i)。如果那个也应该包含在TRUE 列表中;那么可能需要在某处添加abs()
  • 但它是真实的。它应该包括在内。但不是第五个,正如 cmets 中已经显示的那样。
  • Re(eigen(M)$values) 产生-0.5 -0.5 1.0 -1.0 1.0。根据 OP,其中一个条件是,如果我正确理解了这个问题,则只应包括实数值等于 1 的值。第三个和第五个值在浮点计算的精度范围内满足这个条件,但第四个不满足。
【解决方案2】:

您可能必须使用abs;这与浮点精度有关:

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

【讨论】:

  • “使用”abs 只是达到目的的手段,而不是这样做的原因(或唯一解决方案)。
  • 如果回答者讨论编辑中列出的 R 中浮点数的几种解决方案的优缺点,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 2014-12-13
  • 2012-08-25
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多