R没有正确认识到平等

时间:2018-06-17 06:27:43

标签: r

我正在尝试根据哪一行具有最高值来对矩阵进行分类。我的代码工作正常,除了第一行和第三行具有相同的值 - 然后输出是第三个值大于第一个。  例如,当我使用以下矩阵时:

        , , 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。

可能出现此错误的任何想法?非常感谢你!

1 个答案:

答案 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"

但实际情况是,您的问题无法重现。使用您表示的数据生成数组并运行代码,执行后pos0equal1

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