首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中创建矩阵的更有效的代码

在R中创建矩阵的更有效的代码
EN

Stack Overflow用户
提问于 2018-08-01 02:54:39
回答 5查看 94关注 0票数 1

我想要构建一个矩阵,其中行的第一列是从1到3的随机值,第二列是从1到4的随机值,依此类推,列号为tm-3。我创建了以下代码来用随机数填充矩阵

代码语言:javascript
复制
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,并用随机数填充前几列?

EN

回答 5

Stack Overflow用户

发布于 2018-08-01 03:24:37

下面是一种替换双循环的方法:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2018-08-01 03:17:56

这是一种使用单个for循环的方法-通过将sample大小设置为行数,您可以一次完成所有列:

代码语言:javascript
复制
for(j in 1:(tm-3)){
    A[,j] <- sample(1:c(j+2), size = nrow(A), replace = T)
  }

这是一种没有for循环的方法,用最大允许值填充每一列,乘以runif值,然后取最大值:

代码语言:javascript
复制
A[, 1:(tm - 3)] = ceiling(rep(1:(tm - 3) + 2, each = nrow(A)) * runif(nrow(A) * (tm - 3)))

当然,您可以用矩阵的其余部分所在的行跟上这两行中的任何一行:

代码语言:javascript
复制
    A[ ,-(1:c(tm-3))] <- sample(1:tm, 16, replace = T)
票数 1
EN

Stack Overflow用户

发布于 2018-08-01 03:26:29

下面是一个仅使用单个循环的解决方案:

代码语言:javascript
复制
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

代码语言:javascript
复制
#> 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     3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51620231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档