-2

我不确定我在这里做错了什么。

ee <- eigen(crossprod(X))$values
for(i in 1:length(ee)){
if(ee[i]==0:1e^-9) stop("singular Matrix")}

使用特征值方法,我试图确定矩阵是否是奇异的。我试图找出矩阵的特征值之一是否在 0 到 10^-9 之间。如何正确使用 if 语句(如上)来实现我的目标?有没有其他方法可以解决这个问题?

如果我想连接向量中的零特征值怎么办

zer <-NULL
ee <- eigen(crossprod(X))$values 
for(i in 1:length(ee)){ 
if(abs(ee[i])<=1e-9)zer <- c(zer,ee[i])} 

我可以这样做吗?

4

3 回答 3

3

@AriBFriedman 非常正确。但是,我可以看到其他一些问题

  • 1e^-9应该是1e-9
  • 0:1e-9返回0, (:在 0 和 1e-9 之间创建一个序列,因此仅返回0。有关?`:`详细信息,请参阅
  • ==由于浮点运算,使用小数会导致问题

在书面形式中,您的代码(单独)检查元素是否ee[i] == 0不是您想要的(在浮点运算方面也没有意义)

您正在寻找特征值小于这个小数的情况,因此请使用小于 ( <)。

你正在寻找的是类似的东西

if(any(abs(ee) < 1e-9))  stop('singular matrix')

如果你想得到0(或小的)特征向量,那么使用which

# this will give the indexs (which elements are small)
small_values <- which(abs(ee) < 1e-9))
# and those small values
ee[small_values]

不需要for循环,因为所做的一切都是矢量化的。

于 2012-09-12T01:18:15.170 回答
2

if接受长度为 1的单个参数。

尝试使用ifelse或使用any()all()将逻辑向量转换为长度为 1 的逻辑向量。

于 2012-09-12T00:54:33.340 回答
1

这是一个重现您的数据的示例:

X <- matrix(1:10,1:10)
ee <- eigen(crossprod(X))$values

这将测试are ANDif any的值ee> 0< 1e-9

if (any((ee > 0) & (ee < 1e-9))) {stop("singular matrix")}
于 2012-09-12T01:22:36.010 回答