有效地获得稀疏矩阵

时间:2018-03-22 14:44:11

标签: r 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大小相同的密集矩阵,我绝对不想这样做

有没有一种方法可以得到像上面这样的结果,而不会在途中创建密集的矩阵?

1 个答案:

答案 0 :(得分:4)

我想你想要

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

查看showMethods("which"),似乎设置为与稀疏矩阵一起高效工作。通过操作内部@p(列指针)和@i(行指针)插槽,您还可以更直接地(但难以理解地)获得稀疏的,面向列的矩阵的答案:

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