Applying/looping 基于 R 中多个 lists/matrices 的自定义函数
Applying/looping a customized function based on multiple lists/matrices in R
我有四个大列表,我使用此函数将其转换为矩阵:
array(as.matrix(unlist(mat2)), dim=c(3, 80, 100))
我已取消列出列表以将其转换为矩阵形式(不确定是否需要,但 object.size
作为矩阵要小得多)。如果使用列表更容易,请说出来。 matrices/lists 有 132 个元素,但为了简单起见,我们在这里假设 100 个。
mat1
num [1:80, 1:100] 0.00669 0.00603 0.00895 0.00771 0.01533 ...
mat2
num [1:80, 1:80, 1:100] 0.0033 -0.00474 -0.00261 0.00587 -0.00599 ...
mat3
num [1:3, 1:80, 1:100] 0.0159 -0.0131 -0.0131 -0.0656 0.0554 ...
mat4
num [1:10, 1:3] 0.00545 0.01043 0.00563 0.00431 0.00464 ...
这是我的函数:
customfunction <- function
(
mat1, # num [1:80, 1:100]
mat2, # num [1:80, 1:80, 1:100]
mat3=NULL, # num [1:3, 1:80, 1:100]
mat4=NULL, # num [1:10, 1:3]
a=0.025 # scalar
)
{
omega = diag(c(1,diag(a * mat3 %*% mat2 %*% t(mat3))))[-1,-1]
temp = solve(t(mat3) %*% solve(omega) %*% mat3 + solve(a * mat2))
out = temp %*% (solve(a * mat2) %*% mat1 + t(mat3) %*% solve(omega) %*% mat4)
return(out)
}
代替运行宁:
customfunction(mat1[1,], mat2[,,1], mat3[,,1], mat4[1,])
customfunction(mat1[2,], mat2[,,2], mat3[,,2], mat4[1,])
customfunction(mat1[3,], mat2[,,3], mat3[,,3], mat4[1,])
...
customfunction(mat1[61,], mat2[,,61], mat3[,,61], mat4[2,])
customfunction(mat1[61,], mat2[,,61], mat3[,,61], mat4[2,])
etc...
或
customfunction(mat1[1,], mat2[[1]], mat3[[1]], mat4[1,])
customfunction(mat1[2,], mat2[[2]], mat3[[2]], mat4[1,])
customfunction(mat1[3,], mat2[[3]], mat3[[3]], mat4[1,])
...
customfunction(mat1[61,], mat2[[61]], mat3[[61]], mat4[2,])
customfunction(mat1[61,], mat2[[61]], mat3[[61]], mat4[2,])
请注意,mat4[i,]
每 60 次迭代都会更改一次,即我应用它 60 次并保持 mat4[1,]
不变,然后在接下来的第 60 次迭代中应用 mat[2,]
。是否可以应用(或循环)它,使每个 element/row 函数 运行 100 次,从而创建一个 100x80 矩阵?如果可以,怎么做?
非常感谢!
这是 sapply()
的任务:
sapply(1:100, function(i) customfunction(mat1[i,], mat2[,,i], mat3[,,i], mat4[1+ (i-1)%/%60,]))
或
sapply(1:100, function(i) customfunction(mat1[i,], mat2[[i]], mat3[[i]], mat4[1+ (i-1)%/%60,]))
我有四个大列表,我使用此函数将其转换为矩阵:
array(as.matrix(unlist(mat2)), dim=c(3, 80, 100))
我已取消列出列表以将其转换为矩阵形式(不确定是否需要,但 object.size
作为矩阵要小得多)。如果使用列表更容易,请说出来。 matrices/lists 有 132 个元素,但为了简单起见,我们在这里假设 100 个。
mat1
num [1:80, 1:100] 0.00669 0.00603 0.00895 0.00771 0.01533 ...
mat2
num [1:80, 1:80, 1:100] 0.0033 -0.00474 -0.00261 0.00587 -0.00599 ...
mat3
num [1:3, 1:80, 1:100] 0.0159 -0.0131 -0.0131 -0.0656 0.0554 ...
mat4
num [1:10, 1:3] 0.00545 0.01043 0.00563 0.00431 0.00464 ...
这是我的函数:
customfunction <- function
(
mat1, # num [1:80, 1:100]
mat2, # num [1:80, 1:80, 1:100]
mat3=NULL, # num [1:3, 1:80, 1:100]
mat4=NULL, # num [1:10, 1:3]
a=0.025 # scalar
)
{
omega = diag(c(1,diag(a * mat3 %*% mat2 %*% t(mat3))))[-1,-1]
temp = solve(t(mat3) %*% solve(omega) %*% mat3 + solve(a * mat2))
out = temp %*% (solve(a * mat2) %*% mat1 + t(mat3) %*% solve(omega) %*% mat4)
return(out)
}
代替运行宁:
customfunction(mat1[1,], mat2[,,1], mat3[,,1], mat4[1,])
customfunction(mat1[2,], mat2[,,2], mat3[,,2], mat4[1,])
customfunction(mat1[3,], mat2[,,3], mat3[,,3], mat4[1,])
...
customfunction(mat1[61,], mat2[,,61], mat3[,,61], mat4[2,])
customfunction(mat1[61,], mat2[,,61], mat3[,,61], mat4[2,])
etc...
或
customfunction(mat1[1,], mat2[[1]], mat3[[1]], mat4[1,])
customfunction(mat1[2,], mat2[[2]], mat3[[2]], mat4[1,])
customfunction(mat1[3,], mat2[[3]], mat3[[3]], mat4[1,])
...
customfunction(mat1[61,], mat2[[61]], mat3[[61]], mat4[2,])
customfunction(mat1[61,], mat2[[61]], mat3[[61]], mat4[2,])
请注意,mat4[i,]
每 60 次迭代都会更改一次,即我应用它 60 次并保持 mat4[1,]
不变,然后在接下来的第 60 次迭代中应用 mat[2,]
。是否可以应用(或循环)它,使每个 element/row 函数 运行 100 次,从而创建一个 100x80 矩阵?如果可以,怎么做?
非常感谢!
这是 sapply()
的任务:
sapply(1:100, function(i) customfunction(mat1[i,], mat2[,,i], mat3[,,i], mat4[1+ (i-1)%/%60,]))
或
sapply(1:100, function(i) customfunction(mat1[i,], mat2[[i]], mat3[[i]], mat4[1+ (i-1)%/%60,]))