一次填充一个矩阵一个随机单元格

时间:2014-05-13 15:52:08

标签: r matrix while-loop

我随机填写10x10 martix(mat),直到sum(mat) == 100

我写了以下内容....(i = 2的原因还没有在此指定,但我保留在2以与我的实际代码保持一致)

 mat <- matrix(rep(0, 100), nrow = 10)
 mat[1,]  <- c(0,0,0,0,0,0,0,0,0,1)
 mat[2,]  <- c(0,0,0,0,0,0,0,0,1,0)
 mat[3,]  <- c(0,0,0,0,0,0,0,1,0,0)
 mat[4,]  <- c(0,0,0,0,0,0,1,0,0,0)
 mat[5,]  <- c(0,0,0,0,0,1,0,0,0,0)
 mat[6,]  <- c(0,0,0,0,1,0,0,0,0,0)
 mat[7,]  <- c(0,0,0,1,0,0,0,0,0,0)
 mat[8,]  <- c(0,0,1,0,0,0,0,0,0,0)
 mat[9,]  <- c(0,1,0,0,0,0,0,0,0,0)
 mat[10,] <- c(1,0,0,0,0,0,0,0,0,0)

 i <- 2

 set.seed(129)

 while( sum(mat) < 100 ) {
 # pick random cell
 rnum <- sample( which(mat < 1), 1 )
 mat[rnum] <- 1
 ##
 print(paste0("i =", i))
 print(paste0("rnum =", rnum))
 print(sum(mat))
 i = i + 1
 }

出于某种原因sum(mat) == 99有几个额外的步骤...我会假设i = 91 while一旦while( sum(mat) < 100 & length(which(mat < 1)) > 0 ) 停止,但它会继续经过这个。可以解释我做错了什么......

如果我将while条件更改为

{{1}}

问题仍然存在..

4 个答案:

答案 0 :(得分:2)

您的问题等同于随机排序矩阵的索引等于0.您可以使用sample(which(mat < 1))在一行中执行此操作。我想如果你想获得完全相同的输出,你可以尝试类似的东西:

set.seed(144)
idx <- sample(which(mat < 1))
for (i in seq_along(idx)) {
  print(paste0("i =", i))
  print(paste0("rnum =", idx[i]))
  print(sum(mat)+i)
}
# [1] "i =1"
# [1] "rnum =5"
# [1] 11
# [1] "i =2"
# [1] "rnum =70"
# [1] 12
# ...

答案 1 :(得分:1)

请参阅?sample

Arguments:

       x: Either a vector of one or more elements from which to choose,
          or a positive integer.  See ‘Details.’

...

     If ‘x’ has length 1, is numeric (in the sense of ‘is.numeric’) and
     ‘x >= 1’, sampling _via_ ‘sample’ takes place from ‘1:x’.  _Note_
     that this convenience feature may lead to undesired behaviour when
     ‘x’ is of varying length in calls such as ‘sample(x)’.  See the
     examples.

换句话说,如果xsample(x)的长度为1,sample会从1:x返回一个随机数。这发生在循环结束时,矩阵中只剩下一个0,which(mat < 1)返回一个索引。

答案 2 :(得分:1)

迭代在99级重复,因为sample()在第一个参数是长度为1的向量且大于1的向量时表现非常不同。当长度为1时,它假定您从1开始随机数那个数字。如果长度> 1,则从该向量中获取一个随机数。

比较

sample(c(99,100),1)

sample(c(100),1)

当然,这是一种填充矩阵的低效方法。正如@josilber指出的那样,只需拨打一次sample即可完成您需要的一切。

答案 3 :(得分:0)

当您只有一个&#39; 0&#39;剩下的价值。

例如,执行此操作:

sample

现在你有一个所有1的矩阵。现在让我们制作两个数字0:

which

然后示例

mat <- matrix(rep(1, 100), nrow = 10)

通过添加mat[15]<-0 mat[18]<-0 参数,您可以获得一个或另一个

现在让我们试试这个:

sample(which(mat<1))
[1] 18 15

哎呀,你没有得到size=1。相反,仅在一个整数中发生的事情(在这种情况下为15)传递给mat[18]<-1 sample(which(mat<1)) [1] 3 13 8 2 4 14 11 9 10 5 15 7 1 12 6 。如果[1] 15sample是一个整数,它会以sample(x)为例,以随机顺序为整数提供样本。