我正在尝试完成作业问题
我成功创建了一个随机生成的矩阵,但我不知道如何一次性创建多个矩阵。
runif(4,min=-10,max=10)
m=matrix(runif(4*n), ncol = 2, nrow = 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)
}
快速基准测试
我们看到FLoop
和FLapply
函数更快,这在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))
}