在R中如何并行创建大矩阵
现在我要建立一个大矩阵。这很费时。所以我想同时做。例如,矩阵是10^7 x 16,对于每一列,我定义一个向量函数来计算值。就像这里,我应该有16个函数。然后,我想把作业分配给16个核,并行计算每一列,最后给我这个大矩阵。我怎样才能在R中做到这一点?谢谢 现在我尝试了几个包,比如parallel、foreach、doParallel。对于某些错误,它不起作用 下面是我尝试过的一个简单例子在R中如何并行创建大矩阵,r,matrix,parallel-processing,R,Matrix,Parallel Processing,现在我要建立一个大矩阵。这很费时。所以我想同时做。例如,矩阵是10^7 x 16,对于每一列,我定义一个向量函数来计算值。就像这里,我应该有16个函数。然后,我想把作业分配给16个核,并行计算每一列,最后给我这个大矩阵。我怎样才能在R中做到这一点?谢谢 现在我尝试了几个包,比如parallel、foreach、doParallel。对于某些错误,它不起作用 下面是我尝试过的一个简单例子 library(parallel) N1 = 100 rka = rep(1, N1) rkb = r
library(parallel)
N1 = 100
rka = rep(1, N1)
rkb = rep(2, N1)
rkab = rep(3,N1)
rna = rep(4,N1)
rnb = rep(5,N1)
rnab = rep(6,N1)
E1 = cbind(rna,rnb-1,rnab,rka-1,rkb,rkab+1)
E2 = cbind(rna,rnb,rnab,rka-1,rkb,rkab+1)
E3 = cbind(rna-1,rnb,rnab,rka,rkb-1,rkab+1)
E4 = cbind(rna,rnb,rnab,rka,rkb-1,rkab+1)
VDelta = Matrix(0,nrow= 100,ncol= 4,sparse=TRUE)
N_a<- cbind(E1[,1]+E1[,3]+E1[,4]+E1[,6],E2[,1]+E2[,3]+E2[,4]+E2[,6],E3[,1]+E3[,3]+E3[,4]+E3[,6],E4[,1]+E4[,3]+E4[,4]+E4[,6])
N_b<- cbind(E1[,2]+E1[,3]+E1[,5]+E1[,6],E2[,2]+E2[,3]+E2[,5]+E2[,6],E3[,2]+E3[,3]+E3[,5]+E3[,6],E4[,2]+E4[,3]+E4[,5]+E4[,6])
Mab <- M_0*(1-N_b/K_b)
Mba <- M_0*(1-N_a/K_a)
lambda_ab<- 2/(Mab+Mba)
C_b = 0.4
C_a = 0.4
fun = function(i){
if(i == 2) VDelta[,2] <- C_b*(E2[,6] +1)
else if (i == 4) VDelta[,4] <- C_a*(E4[,6] +1)
else if (i == 1) VDelta[,1] <- lambda_ab[,1]*E1[,6]
else VDelta[,3] <- lambda_ab[,3]*E3[,6]
VDelta[,i] = VDelta[,i]
}
no_cores = detectCores()
cl<-makeCluster(no_cores)
clusterExport(cl, "fun")
clusterExport(cl, "lambda_na")
clusterExport(cl, "lambda_nb")
clusterExport(cl, "Mab")
clusterExport(cl, "Mba")
clusterExport(cl, "lambda_ab")
clusterExport(cl, "E1")
clusterExport(cl, "E2")
clusterExport(cl, "E3")
clusterExport(cl, "E4")
clusterExport(cl, "C_b")
clusterExport(cl, "C_a")
clusterExport(cl, "VDelta")
V = parSapply(cl = cl, 1:4,fun)
stopCluster(cl)
如果将由
矩阵
包创建的矩阵导出到集群辅助对象,则必须使用以下方法在辅助对象上加载矩阵
:
clusterEvalQ(cl, library(Matrix))
我还建议您结合导出以提高效率和可读性:
clusterExport(cl, c("fun", "lambda_na", "lambda_nb", "Mab"))
如果将由
矩阵
包创建的矩阵导出到集群辅助对象,则必须使用以下方法在辅助对象上加载矩阵
:
clusterEvalQ(cl, library(Matrix))
我还建议您结合导出以提高效率和可读性:
clusterExport(cl, c("fun", "lambda_na", "lambda_nb", "Mab"))
请注意,在
fun
中,当您提供lambda\u ab=0.2
时,您指定了lambda\u ab[,1]
和lambda\u ab[,3]
。将它们更改为lambda\u ab
确实会给出您提供的错误。抱歉,复制示例时出错。我编辑了它。现在代码仍然给出相同的错误。请注意,在fun
中指定lambda_ab[,1]
和lambda_ab[,3]
时,您提供了lambda_ab=0.2
。将它们更改为lambda_ab
确实会给出您提供的错误。抱歉,我复制示例时出错。我编辑了它。现在代码仍然给出相同的错误。