说我有一个当前未向量化的函数。以下仅是示例:
FunctionNotVectorized = function(x,y,some_options) return(x[1]+y[1])
其中有 10个不同的选项。我想
1e5 x 1e5
的矩阵。 首先,我通过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)
不起作用。任何帮助将不胜感激。
答案 0 :(得分:1)
避免在R中使用循环,因为这样会使计算速度降低数百倍。仅当迭代次数小于100时,才可以使用for / while / etc
使用lapply以相同的方式对任何对象进行操作,然后执行do.call从列表中聚合它们。使用列表而不是分配。 lapply和list是密友
以下是尺寸为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
...