R-следующие петли - PullRequest
       47

R-следующие петли

0 голосов
/ 04 июня 2019

Я пытаюсь написать код для моделирования трехмерного массива размером 4 * 16 * 10, где каждая ячейка содержит матрицу 10 * 10

Пока я делал гнезда для циклов, но они очень медленные. Я хочу заменить их функциями apply или mapply.

M=10
N=10
c=2
n=seq(1, 4, by=1)
p=0.25
q=seq(1,0.25, by =-0.05)
ntrials = 10




for (i in 1:length(n)){
  for (j in 1:length(q)){
    for (k in 1:ntrials){
      plant_subm=matrix_plantsubm(M,N,c,n,p,q)

}
}
}

Здесь matrix_plantsubm - это функция, которая генерирует 10 * 10 матриц. Мне нужно получить матрицы для каждого выбора n и q и повторить это 10 раз.

Я довольно новичок в R и не знаю, как улучшить мой код. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 05 июня 2019

Данные (OP)

M=10
N=10
c=2
n=seq(1, 4, by=1)
p=0.25
q=seq(1,0.25, by =-0.05)
ntrials = 10

Создание параметров, передача функции через pmap

Это создаст все необходимые вам комбинации значений

params <- expand.grid(
  trial = 1:10,
  M = M,
  N = N,
  c = c,
  n = n,
  p = p,
  q = q
) %>%
  as_tibble()

View(params)

# > nrow(params)
# [1] 640

# replace with your own, of course
my_madeup_function <-
  function(M, N, c, n, p, q) {
    matrix(data = rep(M * N + c - n * p * q, 100),
           nrow = 10,
           ncol = 10)
  }

# we use `purrr::pmap`, an apply-type function to pass all of the parameters (except for trials) to the function:

result <- tibble(matrix = pmap(select(params, -trial), my_madeup_function))

Свяжите параметры и результаты в хорошем резюме:

summary <- bind_cols(params, result)

Давайте посмотрим на результаты:

    > summary
# A tibble: 640 x 8
   trial     M     N     c     n     p     q matrix              
   <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <list>              
 1     1    10    10     2     1  0.25     1 <dbl[,10] [10 x 10]>
 2     2    10    10     2     1  0.25     1 <dbl[,10] [10 x 10]>
 3     3    10    10     2     1  0.25     1 <dbl[,10] [10 x 10]>
 4     4    10    10     2     1  0.25     1 <dbl[,10] [10 x 10]>
 5     5    10    10     2     1  0.25     1 <dbl[,10] [10 x 10]>
 6     6    10    10     2     1  0.25     1 <dbl[,10] [10 x 10]>
 7     7    10    10     2     1  0.25     1 <dbl[,10] [10 x 10]>
 8     8    10    10     2     1  0.25     1 <dbl[,10] [10 x 10]>
 9     9    10    10     2     1  0.25     1 <dbl[,10] [10 x 10]>
10    10    10    10     2     1  0.25     1 <dbl[,10] [10 x 10]>
# ... with 630 more rows

Мы можем выбрать определенный с чем-то вроде:

summary %>%
  filter(trial == 8, n == 2, q == 0.5) %>%
  .$matrix %>% 
  .[[1]]

На моей машине microbenchmark::microbenchmark сообщил о времени работы около 7 мс, но это было с моей "фиктивной" функцией.Надеюсь, ваша функция тоже работает быстро.Удачи.

...