【问题标题】:Populating Large Matrix and Computations填充大型矩阵和计算
【发布时间】:2015-04-01 16:42:00
【问题描述】:

我试图在 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 完全锁定的警告。

【问题讨论】:

  • 也许,提供更多关于您想要实现的目标的信息会更有帮助;即这个特定问题可以通过outer(x, x, "==") * (x != 0) 解决。尽管如此,“Matrix”包在这里应该很有帮助。

标签: r for-loop matrix sparse-matrix


【解决方案1】:

您可以将其矢量化,这应该对您有所帮助。此外,如果您的数据确实是稀疏的,并且您可以对稀疏矩阵进行分析,那么这绝对是值得考虑的事情。

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 的大量开销。

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2018-05-05
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多