我正在尝试根据哪一行具有最高值来对矩阵进行分类。我的代码工作正常,除了第一行和第三行具有相同的值 - 然后输出是第三个值大于第一个。 例如,当我使用以下矩阵时:
, , 1
[,1] [,2] [,3]
[1,] 0.5+0i 0.5+0i 0.5+0i
[2,] 0.0+0i 0.0+0i 0.0+0i
[3,] 0.5+0i 0.5+0i 0.5+0i
以下代码:
null <- 0
neg <- 0
pos <- 0
equal <- 0
for(i in 1){
if(Re(pie.ch[1,1,i])>Re(pie.ch[2,1,i]) &&
Re(pie.ch[1,1,i])>Re(pie.ch[3,1,i])){
neg<-neg+1
}
if(Re(pie.ch[3,1,i])>Re(pie.ch[1,1,i]) &&
Re(pie.ch[3,1,i])>Re(pie.ch[2,1,i])){
pos<-pos+1
}
if(Re(pie.ch[2,1,i])>Re(pie.ch[1,1,i]) &&
Re(pie.ch[2,1,i])>Re(pie.ch[3,1,i])){
null<-null+1
}
if((Re(pie.ch[1,1,i])==Re(pie.ch[2,1,i]) &&
Re(pie.ch[1,1,i])>Re(pie.ch[3,1,i]))||
(Re(pie.ch[1,1,i])==Re(pie.ch[3,1,i])&&
Re(pie.ch[1,1,i])>Re(pie.ch[2,1,i])||
(Re(pie.ch[2,1,i])==Re(pie.ch[3,1,1])&&
Re(pie.ch[3,1,i])>Re(pie.ch[1,1,i]))||
Re(pie.ch[1,1,i])==Re(pie.ch[2,1,i]) &&
Re(pie.ch[2,1,i])==Re(pie.ch[3,1,i]))){
equal<-equal+1
}
}
null
neg
pos
equal
我得到以下输出,这显然是错误的:
> null
[1] 0
> neg
[1] 0
> pos
[1] 1
> equal
[1] 0
但是,如果所有三个值都相同,则代码可以正常工作(我尝试将所有值都设置为0),给我一个1表示Equal,一个0表示Pos。
可能出现此错误的任何想法?非常感谢你!
答案 0 :(得分:1)
如果没有您的对象,很难说出您的问题可能是什么,但在平等的逻辑测试不符合我的期望时,我通常会寻找这些。
(x <- 0.5+0i + 1e-8)
# [1] 0.5+0i
Re(x) == 0.5
# [1] FALSE
x
的实际部分实际上不等于0.5
。它只是显示为0.5
。您可以使用as.character(x)
进行检查,此处将显示"0.50000001+0i"
。要真正深入了解,请尝试format(x, digits = 16)
。
(x <- 0.5+0i + .Machine$double.eps)
format(x, digits = 16)
# [1] "0.5000000000000002+0i"
但实际情况是,您的问题无法重现。使用您表示的数据生成数组并运行代码,执行后pos
为0
,equal
为1
。
pos <- 0
equal <- 0
pie.ch <- array(0, dim = c(3, 3, 3))
pie.ch[,,1] <- matrix(rep(c(0.5+0i, 0+0i, 0.5+0i), 3), 3)
pie.ch
# , , 1
# [,1] [,2] [,3]
# [1,] 0.5+0i 0.5+0i 0.5+0i
# [2,] 0.0+0i 0.0+0i 0.0+0i
# [3,] 0.5+0i 0.5+0i 0.5+0i
...
i <- 1
if(Re(pie.ch[3,1,i])>Re(pie.ch[1,1,i])&&Re(pie.ch[3,1,i])>Re(pie.ch[2,1,i])){pos<-pos+1}
if((Re(pie.ch[1,1,i])==Re(pie.ch[2,1,i])&&Re(pie.ch[1,1,i])>Re(pie.ch[3,1,i]))||(Re(pie.ch[1,1,i])==Re(pie.ch[3,1,i])&&Re(pie.ch[1,1,i])>Re(pie.ch[2,1,i])||(Re(pie.ch[2,1,i])==Re(pie.ch[3,1,1])&&Re(pie.ch[3,1,i])>Re(pie.ch[1,1,i]))||Re(pie.ch[1,1,i])==Re(pie.ch[2,1,i])&&Re(pie.ch[2,1,i])==Re(pie.ch[3,1,i]))){equal<-equal+1}
pos
# [1] 0
equal
# [1] 1