高效获取稀疏矩阵的非零元素坐标

Efficiently obtaining nonzero element coordinates of sparse matrix

我想获取矩阵 M 中所有非零元素的行列坐标。如果 M 不是太大,那就简单了:

m <- matrix(sample(0:1, 25, TRUE, prob=c(0.75, 0.25)), 5, 5)

     #[,1] [,2] [,3] [,4] [,5]
#[1,]    0    0    0    0    0
#[2,]    1    1    0    0    0
#[3,]    0    0    0    1    0
#[4,]    0    0    1    0    0
#[5,]    0    0    0    0    0

nz <- which(m != 0)
cbind(row(m)[nz], col(m)[nz])

     #[,1] [,2]
#[1,]    2    1
#[2,]    2    2
#[3,]    4    3
#[4,]    3    4

但是,在我的例子中,M 是一个稀疏矩阵(使用 Matrix 包创建),其维度可能非常大。如果我像上面那样调用 row(M)col(M),我将生成几个与 M 大小相同的密集矩阵,我绝对不想这样做。

有没有办法在不创建密集矩阵的情况下获得上述结果?

我想你想要

which(m!=0,arr.ind=TRUE)

查看 showMethods("which"),这似乎是为了有效地处理稀疏矩阵而设置的。您还可以通过操纵内部 @p(列指针)和 @i(行指针)槽更直接地(但难以理解地)获得稀疏 column-oriented 矩阵的答案:

mm <- Matrix(m)
dp <- diff(mm@p)
cbind(mm@i+1,rep(seq_along(dp),dp))