r - 填充大型矩阵和计算

标签 r for-loop matrix sparse-matrix

我试图在 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/

相关文章:

r - 将一列矩阵转换为 n x c 矩阵

r - 在 ggplot 中添加国家/地区名称到 map

javascript - 将 vendor 前缀应用于 Javascript 样式

检查矩阵中的行数是否等于 c 中的给定行数

matlab条件矩阵赋值

r - 将 difftime 时间转换为年、月和日

r - 在向量中寻找峰值

java - for 循环内的条件问题 (JAVA)

r - 用 R 计算每月返回

flutter - 你应该如何进行矩阵变换?