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

问题描述 投票:0回答:1

我想获取矩阵中所有非零元素的行列坐标

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

有没有一种方法可以得到像上面这样的结果,而无需一路创建密集矩阵?

r sparse-matrix
1个回答
5
投票

我想你想要

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))

@tflutre 评论:

如果

m
是对称的,则只有
which(m != 0, arr.ind=TRUE)
始终返回非零坐标的完整列表。使用
mm@p
的代码可能不会!事实上,
mm <- as(m, "sparseMatrix")
可以自动且“默默地”检测 m 是否对称,如果是这样,它可能只存储上(或下)三角值:查看字段
mm@uplo

© www.soinside.com 2019 - 2024. All rights reserved.