Мы можем сделать это, используя 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))
Returns
.....
[[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))
Fast Loop Используя ответ @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))
}