Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中如何并行创建大矩阵_R_Matrix_Parallel Processing - Fatal编程技术网

在R中如何并行创建大矩阵

在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

现在我要建立一个大矩阵。这很费时。所以我想同时做。例如,矩阵是10^7 x 16,对于每一列,我定义一个向量函数来计算值。就像这里,我应该有16个函数。然后,我想把作业分配给16个核,并行计算每一列,最后给我这个大矩阵。我怎样才能在R中做到这一点?谢谢

现在我尝试了几个包,比如parallel、foreach、doParallel。对于某些错误,它不起作用

下面是我尝试过的一个简单例子

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
确实会给出您提供的错误。抱歉,我复制示例时出错。我编辑了它。现在代码仍然给出相同的错误。