我想要构建一个矩阵,其中行的第一列是从1到3的随机值,第二列是从1到4的随机值,依此类推,列号为tm-3。我创建了以下代码来用随机数填充矩阵
tm <- 10
A <- matrix(0, 5, 23)
for(i in 1:5){
for(j in 1:c(tm-3)){
A[i,j] <- sample(1:c(j+2), 1, replace = T)
}
}
A[ ,-c(1:c(tm-3))] <- sample(1:tm, 16, replace = T)这段代码当然工作得很好,但是当出现大矩阵时,双循环会减慢整个程序的运行速度。
根据上面的公式,是否可以去掉double for,并用随机数填充前几列?
发布于 2018-08-01 03:24:37
下面是一种替换双循环的方法:
sapply(1:(tm-3), function(x) {sample(1:(x+2), 5, replace = TRUE)})
# example output
# [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,] 1 1 5 3 3 5 5
# [2,] 2 1 1 1 4 5 2
# [3,] 1 1 3 5 1 1 6
# [4,] 2 1 3 1 7 6 9
# [5,] 2 4 1 1 7 3 8发布于 2018-08-01 03:17:56
这是一种使用单个for循环的方法-通过将sample大小设置为行数,您可以一次完成所有列:
for(j in 1:(tm-3)){
A[,j] <- sample(1:c(j+2), size = nrow(A), replace = T)
}这是一种没有for循环的方法,用最大允许值填充每一列,乘以runif值,然后取最大值:
A[, 1:(tm - 3)] = ceiling(rep(1:(tm - 3) + 2, each = nrow(A)) * runif(nrow(A) * (tm - 3)))当然,您可以用矩阵的其余部分所在的行跟上这两行中的任何一行:
A[ ,-(1:c(tm-3))] <- sample(1:tm, 16, replace = T)发布于 2018-08-01 03:26:29
下面是一个仅使用单个循环的解决方案:
tm <- 10
B <- matrix(ncol=23,nrow=5)
for (i in seq_len(ncol(B))) B[,i] <- sample(min(i+2,tm),nrow(B),replace=TRUE)结果矩阵与其他发布的解决方案的不同之处在于列数中的元素大于tm-3
#> B
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
#[1,] 1 3 4 6 3 7 5 8 6 6 1 6 9 8 2 6
#[2,] 2 1 3 2 3 5 3 3 7 7 4 5 1 4 9 4
#[3,] 2 1 2 2 2 8 3 3 4 5 8 8 4 6 1 1
#[4,] 2 3 5 2 1 7 5 10 7 3 6 2 1 1 8 4
#[5,] 3 3 2 2 2 1 2 9 4 8 2 9 3 6 1 7
# [,17] [,18] [,19] [,20] [,21] [,22] [,23]
#[1,] 10 9 2 6 1 4 8
#[2,] 5 4 10 4 6 2 2
#[3,] 2 4 2 1 3 2 10
#[4,] 6 2 2 4 3 5 2
#[5,] 2 9 2 8 2 1 3https://stackoverflow.com/questions/51620231
复制相似问题