我不确定我在这里做错了什么。
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])}
我能这样做吗?
@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
循环,因为所做的一切都是矢量化的。
if
采用长度为1的单个参数。
尝试使用ifelse
或使用any()
或all()
将逻辑矢量转换为长度为1的逻辑矢量。
以下是复制数据的示例:
X <- matrix(1:10,1:10)
ee <- eigen(crossprod(X))$values
这将测试if
any
ee
的值是> 0
AND< 1e-9
if (any((ee > 0) & (ee < 1e-9))) {stop("singular matrix")}