如果声明在r?

问题描述 投票:-2回答:3

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

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])} 

我能这样做吗?

r eigenvalue
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循环,因为所做的一切都是矢量化的。


2
投票

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

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


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")}
© www.soinside.com 2019 - 2024. All rights reserved.