我试图在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完全锁定。
答案 0 :(得分:2)
你可以对此进行矢量化,这对你有帮助。此外,如果您的数据确实很稀疏,并且您可以在稀疏矩阵上进行分析,那么它肯定是需要考虑的事情。
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的大量开销。