我试图在 for 循环中填充 25000 x 25000 矩阵,但 R 锁定了我。数据有很多零条目,那么稀疏矩阵是否合适?
这里是一些示例数据和代码。
x<-c(1,3,0,4,1,0,4,1,1,4)
y<-x
z<-matrix(NA,nrow=10,ncol=10)
for(i in 1:10){
if(x[i]==0){
z[i,]=0
} else{
for(j in 1:10){
if(x[i]==y[j]){
z[i,j]=1
} else{z[i,j]=0
}
}
}
}
还有一个问题。是否可以对这么大的矩阵进行计算?当我对这种大小的一些样本矩阵执行一些计算时,我得到 NA 的输出,并带有整数溢出或 R 完全锁定的警告。
最佳答案
您可以对此进行矢量化,这应该会对您有所帮助。另外,如果您的数据确实稀疏并且您可以在稀疏矩阵上进行分析,那么这绝对是值得考虑的事情。
library(Matrix)
# set up all pairs
pairs <- expand.grid(x,x)
# get matrix indices
idx <- which(pairs[,1] == pairs[,2] & pairs[,1] != 0)
# create empty matrix with zero's instead
z<-matrix(0,nrow=10,ncol=10)
z[idx] = 1
# create empty sparse matrix
z2 <-Matrix(0,nrow=10,ncol=10, sparse=TRUE)
z2[idx] = 1
all(z == z2)
[1] TRUE
@alexis_lax 的评论将使这变得更加简单和更快。我完全忘记了 outer
函数。
# normal matrix
z = outer(x, x, "==") * (x!=0)
# sparse matrix
z2 = Matrix(outer(x, x, "==") * (x!=0), sparse=TRUE)
要回答你的第二个问题,是否可以在这么大的矩阵上进行计算,答案是肯定的。您只需要更加谨慎地对待它并使用适当的工具即可。稀疏矩阵很好,许多典型的矩阵函数都可用,并且其他一些包是兼容的。这是link到包含一些示例的页面。
另一个想法,如果您正在处理非常大的矩阵,您可能需要查看其他软件包,例如 bigmemory
,它们旨在处理 R 的巨大开销。
关于r - 填充大型矩阵和计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28282767/