填充大型矩阵和计算

Populating Large Matrix and Computations

我试图在 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 的大开销。