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")}
eeif
采用长度为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")}