如何创建1000个随机生成的2x2矩阵范围(-10和10)

时间:2019-05-11 22:05:05

标签: r

我正在尝试完成作业问题

我成功创建了一个随机生成的矩阵,但我不知道如何一次性创建多个矩阵。

runif(4,min=-10,max=10)
m=matrix(runif(4*n), ncol = 2, nrow = 2)

不会撒谎,我真的不知道自己在做什么

2 个答案:

答案 0 :(得分:1)

您可以尝试:

a<- replicate(100, matrix(runif(4), ncol = 2))

然后,您必须将每个数组作为一个数组进行访问,这意味着您必须在数组的三维空间中进行子集化,例如:

> a[,,2]
          [,1]      [,2]
[1,] 0.8476489 0.6139453
[2,] 0.1315417 0.8195134

另一种方法是使用循环,该循环将生成列表对象,而IMHO子集则更容易一些。

my_list <- list()

for(i in 1:100){
    my_list[[i]]<-matrix(runif(4), ncol = 2)
}

然后您使用my_list[[100]]

访问每个元素

答案 1 :(得分:0)

我们可以使用lapply来完成此任务,有两种主要方法,第二种方法更易于理解,第一种方法效率更高,尤其是当n变大时,

vals <- runif(n*4, min=-10, max=10)
rst2 <- lapply(1:1000, function(i) matrix(vals[i:(i+3)], ncol = 2))

或者,

the.list <- vector(1000, mode = "list") # Create an empyty list
matrix.list <- lapply(the.list, function(x) matrix(runif(4,min=-10,max=10), nrow = 2))

返回

.....

[[999]]
      [,1]      [,2]
[1,] -6.520801 -5.944080
[2,] -4.183131  1.190629

[[1000]]
      [,1]     [,2]
[1,]  1.208202  7.86769
[2,] -2.672111 -8.33435

快速版本,首先生成所需的所有数据,然后将其拆分,然后将所有拆分矢量转换为矩阵,

  vals <- runif(1000*4, min=-10, max=10)
  rst <- split(matrices, rep(1:1000, each = 2))
  rst2 <- lapply(rst, function(x) matrix(x, ncol = 2))

快速循环,以@MDEWITT答案为基础,我们可以执行一些简单的预处理任务来提高效率。

my_list <- vector(n, mode = "list")
vals <- runif(n*4, min=-10, max=10)
for(i in 1:n){
  my_list[[i]]<-matrix(vals[i:(i+3)], ncol = 2,nrow=2)
}

快速基准测试

我们看到FLoopFLapply函数更快,这在n=10000时更加明显。...

n <- 1000
microbenchmark(fun1(n), fun2(n), fun3(n), times = 1000)


Unit: milliseconds
expr          min        lq      mean       median     uq       max neval
Lapply(n)     9.709308  9.993209 19.110734 10.708773 12.259961 2515.7737  1000
Predefine(n)  5.159808  5.389392 11.058017  5.615735  6.673107 1004.6575  1000
MDEWITT(n)    10.838335 11.391154 22.738093 12.243137 13.898335  646.6250 1000
FLoop(n)      5.104331  5.384800  9.139668  5.612018  6.502171  369.3693  1000
FLapply(n)    6.191827  6.687455  10.947632  7.613829  8.667169  274.9425 1000

使用的代码

library(microbenchmark)

Lapply <- function(n=1000){
  the.list <- vector(n, mode = "list")
  matrix.list <- lapply(the.list, function(x) matrix(runif(4,min=-10,max=10), nrow = 2))
}


Predefine <- function(n=1000){
  vals <- runif(n*4, min=-10, max=10)
  rst <- split(vals, rep(1:n, each = 2))
  rst2 <- lapply(rst, function(x) matrix(x, ncol = 2))
}

MDEWITT <- function(n=1000){
  a <- replicate(n, matrix(runif(4*2), ncol = 2, nrow = 2))
}

FLoop <- function(n=1000){
  my_list <- vector(n, mode = "list")
  vals <- runif(n*4, min=-10, max=10)
  for(i in 1:n){
    my_list[[i]]<-matrix(vals[i:(i+3)], ncol = 2,nrow=2)
  }
}


FLapply <- function(n=1000){
  vals <- runif(n*4, min=-10, max=10)
  rst2 <- lapply(1:n, function(i) matrix(vals[i:(i+3)], ncol = 2))
}