我想获取矩阵中所有非零元素的行列坐标
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
(行指针)槽更直接(但难以理解)获得答案:
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
可以自动且“默默地”检测 m 是否对称,如果是这样,它可能只存储上(或下)三角值:查看字段mm <- as(m, "sparseMatrix")
。mm@uplo