微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法为空矩阵中的第7列和第7行分配值

如何解决无法为空矩阵中的第7列和第7行分配值

使用R,我编写了一个双循环,将值分配给一个空的2d矩阵,但事实证明,第7列和第1行始终为空白,而没有错误消息。

data2<-matrix(,nrow = 10,ncol = 10)
for(i in seq(0.01,0.1,0.01)){
  for(j in  seq(0.01,0.01)){
    data2[i*100,j*100]<-i+j
    }}

当我打印data2时:

 data2
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,] 0.02 0.03 0.04 0.05 0.06 0.08   NA 0.09 0.10  0.11
 [2,] 0.03 0.04 0.05 0.06 0.07 0.09   NA 0.10 0.11  0.12
 [3,] 0.04 0.05 0.06 0.07 0.08 0.10   NA 0.11 0.12  0.13
 [4,] 0.05 0.06 0.07 0.08 0.09 0.11   NA 0.12 0.13  0.14
 [5,] 0.06 0.07 0.08 0.09 0.10 0.12   NA 0.13 0.14  0.15
 [6,] 0.08 0.09 0.10 0.11 0.12 0.14   NA 0.15 0.16  0.17
 [7,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA
 [8,] 0.09 0.10 0.11 0.12 0.13 0.15   NA 0.16 0.17  0.18
 [9,] 0.10 0.11 0.12 0.13 0.14 0.16   NA 0.17 0.18  0.19
[10,] 0.11 0.12 0.13 0.14 0.15 0.17   NA 0.18 0.19  0.20

当我进入调试模式并且当i = 0.01,j = 0.07时,发生了奇怪的事情:

browse[2]> i
[1] 0.01
browse[2]> j
[1] 0.07
browse[2]> data2[i*100,j*100]
[1] 0.07
browse[2]> data2[1,7]
[1] NA
browse[2]> i*100
[1] 1
browse[2]> j*100
[1] 7

我真的很困惑为什么data2 [i 100,j 100]无法到达第7列(也就是行),而是返回了data2 [1,6]的值。有人可以帮忙吗?我很感激。谢谢!

解决方法

这是因为该序列是浮点型,并且涉及精度,即它可能不完全等于数字7。

identical(0.07 * 100,7)
#[1] FALSE

(0.07 *100) - 7
#[1] 8.881784e-16

一个选项是round。索引应该为integer,可以通过round

完成
for(i in seq(0.01,0.1,0.01)){
  for(j in  seq(0.01,0.01)){
       data2[round(i*100),round(j*100)] <- i + j
  }}

-输出

data2
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10  0.11
# [2,] 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11  0.12
# [3,] 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12  0.13
# [4,] 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13  0.14
# [5,] 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14  0.15
# [6,] 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14 0.15  0.16
# [7,] 0.08 0.09 0.10 0.11 0.12 0.13 0.14 0.15 0.16  0.17
# [8,] 0.09 0.10 0.11 0.12 0.13 0.14 0.15 0.16 0.17  0.18
# [9,] 0.10 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18  0.19
#[10,] 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19  0.20

无需嵌套for循环,也无需创建空的matrix即可完成

outer(seq(0.01,0.01),seq(0.01,`+`)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。