R 无法为空矩阵中的第7列和第7行赋值

R 无法为空矩阵中的第7列和第7行赋值,r,for-loop,matrix,assign,scientific-computing,R,For Loop,Matrix,Assign,Scientific Computing,对于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 }} 当我进入调试模式,当I=0.01,j=0.07时,奇怪的事情发生了: Browse[2]> i [1] 0.0

对于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
    }}
当我进入调试模式,当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]的值。有人能帮忙吗?我很感激。谢谢

这是因为序列是一个浮点数,它涉及精度,即它可能不完全等于数字7

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

(0.07 *100) - 7
#[1] 8.881784e-16
一个选项是
四舍五入
。索引应该是
整数
,可以通过
四舍五入

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

这可以在没有嵌套的
for
循环和创建空
矩阵的情况下完成

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

谢谢你的回答!接下来的一个问题是,我还尝试使用.integer(0.07*100),但它不能像round()那样工作。为什么呢?我认为as.integer()可以在R中将float转换为int,原因是它不完全等于0.07。您可以检查
seq(0.01,0.1,0.01)=0.07
结果为
as.integer
结果为6而不是7(如果您执行
打印
)@Tong check此处
as.integer(seq(0.01,0.1,0.01)[7]*100)#[1]6
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
outer(seq(0.01, 0.1, 0.01), seq(0.01, 0.1, 0.01), `+`)