如何在多个矩阵中遍历子集索引

时间:2019-03-22 23:13:42

标签: r

问题

说我有一个当前未向量化的函数。以下仅是示例:

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

其中有 10个不同的选项。我想

  • 1)为每个选项定义大小为1e5 x 1e5的矩阵。
  • 2),然后为每个矩阵为其对应的索引分配值。

首先,我通过for循环为每个选项定义了大小为1e5 x 1e5的矩阵:

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 个答案:

答案 0 :(得分:1)

  1. 避免在R中使用循环,因为这样会使计算速度降低数百倍。仅当迭代次数小于100时,才可以使用for / while / etc

  2. 使用lapply以相同的方式对任何对象进行操作,然后执行do.call从列表中聚合它们。使用列表而不是分配。 lapply和list是密友

  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 
}

答案 1 :(得分:1)

只需使用命名列表,而无需使用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
...