Как перебрать подмножества индексов в нескольких матрицах - PullRequest
1 голос
/ 23 марта 2019

Задача

Скажем, у меня есть функция, которая в настоящее время не векторизована. Ниже приведен только пример:

FunctionNotVectorized = function(x,y,some_options) return(x[1]+y[1])

, который имеет, скажем, 10 различных опций . Я хотел бы

  • 1) определить матрицу размера 1e5 x 1e5 для каждой опции.
  • 2) затем для каждой матрицы присвойте значения их соответствующим индексам.

Сначала , я определил матрицу размера 1e5 x 1e5 для каждой опции, для цикла for:

for (k in 1:10){
  assign(sprintf("res%02d", k), matrix(0,1e5,1e5))
}

, который определяет матрицы с именем res01, ... res10.

Второй , я попытался присвоить значения для их соответствующих индексов для каждой матрицы. Но я застрял здесь

Попробуйте

Что бы я хотел сделать:

for (i in 1:1e5){
  for (j in 1:1e5){
    for (k in 1:10){
      assign(sprintf("res%02d[i,j]", k),
             FunctionNotVectorized(i,j,some_options=k))
    }
  }
}

но ясно, assign(sprintf("res%02d[i,j]", k) не работает. Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Просто используйте именованный список без необходимости использовать assign для добавления объектов в глобальную среду:

# BUILD LIST OF MATRICES
my_matrix_list <- setNames(replicate(10, matrix(0,1e5,1e5), simplify = FALSE), 
                           paste0("res", 1:10, "d"))

# DYNAMICALLY ASSIGN VALUE BY OBJECT NAME
for (i in 1:1e5){
  for (j in 1:1e5){
    for (k in 1:10){
      my_matrix_list[paste0("res", k, "d")][i,j] <-
          FunctionNotVectorized(i,j,some_options=k)
    }
  }
}

# REFERENCE ITEMS IN LIST
my_matrix_list$res1d
my_matrix_list$res2d
my_matrix_list$res3d
...
1 голос
/ 23 марта 2019
  1. Избегайте использования циклов в R, потому что in делает вычисления в сотни раз медленнее. Только с итерациями <100 можно использовать для / while / etc </p>

  2. Используйте lapply для одинаковой работы с любыми объектами, затем do.call для их объединения из списка. Используйте списки вместо назначения. lapply и список близких друзей

  3. Вот пример для матриц с размерами 15x15:

mtxs = list()                            #create empty list which will get filled 
for(k in 1:10){                          # loop over 10 matrixes   
mtx = do.call(c,lapply(1:15,function(x){ # gathering second vectorized calculation                
    do.call(c,lapply(1:15,               # gathering first vectorized calculation
      function(y){functionNotVectorized(y, x, k) } ))})) # lapply over rows ans cols   
mtxs[[k]] = matrix(mtx, 15, 15)          # assigning matrices 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...