我想获取矩阵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
大小相同的密集矩阵,我绝对不想这样做
有没有一种方法可以得到像上面这样的结果,而不会在途中创建密集的矩阵?
答案 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))