我有一个巨大的矩阵变量垫,有M行和N列。我需要找到所有非零的位置。目前我正在编写以下代码来执行此操作
Rowindex_set = c() #Generate the set of all row indexes of all non-zero entries
Colindex_set = c() #Generate the set of all col indexes of all non-zero entries
for(i in 1:M){
for(j in 1:N){
if (mat[i,j] != 0){
Rowindex_set = c(Rowindex_set,i)
Colindex_set = c(Colindex_set,j)
}
}
}
M和N通常在一万的范围内。这段代码因此而耗费大量时间。有更快的方法吗?
编辑: 我做了一些修改,并提出了更快的实现。
Rowindex_set = rep.int(0,M*N) #Large vector of zeros
Colindex_set = rep.int(0,M*N) #Large vector of zeros
IndexCounter = 1
for(i in 1:M){
for(j in 1:N){
if (incomp_mat[i,j] != marker){
Rowindex_set[IndexCounter] = i #Update each entry, rather than appending as earlier
Colindex_set[IndexCounter] = j #Similar as above comment
IndexCounter = IndexCounter + 1
}
}
}
Rowindex_set = Rowindex_set[-IndexCounter:-(M*N)] # Remove trailing zeros
Colindex_set = Colindex_set[-IndexCounter:-(M*N)] # Remove trailing zeros
因此,我不是在每次迭代中向Rowindex_set和Colindex_set添加新条目,而是将它们初始化为更大的零向量,然后更新每个条目。最后,我删除了剩余的条目
答案 0 :(得分:0)
之后你要做什么?基于此,你可以非常快。根本不需要写循环。例如,如果您必须用NA替换0,则可以执行此操作。
M <- matrix(c(1,2,3,0,0,2),nrow=2)
M[M==0] <- NA
## OR change all nonzero elements
M[M!=0] <- NA
所以,提一下你接下来要做的事情,取决于你能找到一种方法来做到这一点。
如果仅仅是为了获取指数,请尝试
apply(M,2,function(x) which(x!=0))
列为非零的非零指数