【问题标题】:Unable to assign values to 7th column and row in an empty matrix无法为空矩阵中的第 7 列和第 7 行赋值
【发布时间】:2021-01-04 14:58:15
【问题描述】:

使用 R,我编写了一个双循环来为一个空的 2d 矩阵赋值,但事实证明,第 7 列和第 7 行总是留空而没有错误消息。

data2<-matrix(,nrow = 10,ncol = 10)
for(i in seq(0.01,0.1,0.01)){
  for(j in  seq(0.01,0.1,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[i100,j100] 无法到达第 7 列(也就是行),而是返回了 data2[1,6] 的值。有人可以帮忙吗?我很感激。谢谢!

【问题讨论】:

    标签: r for-loop matrix assign scientific-computing


    【解决方案1】:

    这是因为序列是一个浮点数,并且涉及到精度,即它可能不完全等于数字 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.1,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.1, 0.01), seq(0.01, 0.1, 0.01), `+`)
    

    【讨论】:

    • 感谢您的回答!一个后续问题,我也尝试了 as.integer(0.07*100),但它不起作用,因为 round() 有效。这是为什么?我认为 as.integer() 可以在 R 中将 float 转换为 int?
    • @Tong 原因是它不完全等于0.07。您可以检查 seq(0.01, 0.1, 0.01) == 0.07 导致 as.integer 导致 6 而不是 7(如果您执行 print
    • @Tong 在这里查看as.integer(seq(0.01, 0.1, 0.01)[7] * 100)# [1] 6
    猜你喜欢
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多