r中的if语句?

r中的if语句?,r,eigenvalue,R,Eigenvalue,我不确定我在这里做错了什么 ee <- eigen(crossprod(X))$values for(i in 1:length(ee)){ if(ee[i]==0:1e^-9) stop("singular Matrix")} eeif采用长度为1的单个参数 尝试使用ifelse或使用any()或all()将逻辑向量转换为长度为1的逻辑向量。@AriBFriedman是非常正确的。不过,我可以看到一些其他问题 1e^-9应该是1e-9 0:1e-9返回0,(:创建一个介于0和1e-9

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

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

ee
if
采用长度为1的单个参数


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

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

  • 1e^-9
    应该是
    1e-9
  • 0:1e-9
    返回
    0
    ,(
    创建一个介于0和1e-9之间的序列,因此只返回
    0
    。有关详细信息,请参见
    ?`:`
  • 使用带小数的
    ==
    将由于浮点运算而导致问题
在编写的表单中,您的代码(单独)检查元素是否
ee[i]==0
,这不是您想要的(在浮点运算方面也没有意义)


您正在寻找特征值小于这个小数字的情况,因此请使用小于(
以下是一个复制数据的示例:

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

在你的if语句的情况下,你到底想传达什么?你已经问了几个问题,但是你没有投票一个答案,也没有接受一个。请考虑这样做()@flodel我对该网站还不熟悉,但仍然掌握着一些窍门。谢谢你的建议。两个部分都不需要for循环,请参阅我的解决方案。你是对的,0:1e-9将返回零,我对1e^-9非常了解。我这样写是为了确定这是一个小数字。如果你发布了不起作用的代码并要求修复它,则会出现错误输入已知语法错误毫无意义!
if(any(abs(ee) < 1e-9))  stop('singular matrix')
# this will give the indexs (which elements are small)
small_values <- which(abs(ee) < 1e-9))
# and those small values
ee[small_values]
X <- matrix(1:10,1:10)
ee <- eigen(crossprod(X))$values
if (any((ee > 0) & (ee < 1e-9))) {stop("singular matrix")}