Как создать 1000 случайно сгенерированных матриц 2x2 диапазона (-10 и 10) - PullRequest
1 голос
/ 12 мая 2019

Я пытаюсь выполнить домашнее задание

Мне удалось создать случайно сгенерированную матрицу, но я не знаю, как создать более одного за один раз.

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

не буду врать, я действительно не знаю, что я делаю

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Вы можете попробовать:

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

Затем вам нужно получить доступ к каждому из них как к массиву, что означает, что вы должны поместить в третье измерение массива следующее:

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

Другой способ был бы с циклом, который генерировал бы объекты списка, которые немного проще ИМХО для подмножества.

my_list <- list()

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

Затем вы получаете доступ к каждому элементу с помощью my_list[[100]]

0 голосов
/ 12 мая 2019

Мы можем сделать это, используя 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))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...