【发布时间】:2020-10-27 03:01:19
【问题描述】:
假设我有一个任意概率矩阵P,如下所示,
P = matrix(c(0.3,0.2,0.2,0.2,0.3,0.2,0.2,0.2,0.3),3,3)
P
[,1] [,2] [,3]
[1,] 0.3 0.2 0.2
[2,] 0.2 0.3 0.2
[3,] 0.2 0.2 0.3
对于单个邻接矩阵,它的生成类似于(未加权,无自放样)
tem = matrix(runif(3^2), nrow = 3)
tmpG = 1 * (tmpmat < P)
tmpG[lower.tri(tmpG)] <- 0
tmpG <- t(tmpG) + tmpG - diag(diag(tmpG))
但是,如果我需要生成100个邻接矩阵怎么办,所以我写下以下代码
G = list()
for (i in 1:rep) {
tmpmat = matrix(runif(n^2), nrow = n)
tmpG = 1 * (tmpmat < P)
tmpG[lower.tri(tmpG)] <- 0
tmpG <- t(tmpG) + tmpG - diag(diag(tmpG))
if (noloop) {
diag(tmpG) = 0
}
G[[i]] = tmpG
}
在我的情况下,n >10000 和 T = 1000,所以它非常慢,有什么更好的改进方法吗?
【问题讨论】:
-
编写的代码(加上 noloop=FALSE、rep replicate 将成为您避免Second Circle of the R Inferno 的朋友
-
在我的例子中,n > 10000, T = 1000。谢谢
-
你的例子中的小错字,你有
tem,我认为你的意思是tmpmat?另外,您能否澄清一下,当您说n > 10000时,您当前使用的维度是3吗?当您说T = 1000时,是您当前使用的复制次数(未定义)rep? -
Dubukay 是对的,
replicate(rep, {<<code inside your for loop>>})会更快,但是当你的矩阵变大时,它可能已经无关紧要了。如果不改进算法,我认为您不会获得太多速度。也许你可以只操作上面的三角形?
标签: r igraph rcpp rcpparmadillo