通过R中的矩阵的更快的方式

时间:2015-04-24 04:33:45

标签: r

我有一个巨大的矩阵变量垫,有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添加新条目,而是将它们初始化为更大的零向量,然后更新每个条目。最后,我删除了剩余的条目

1 个答案:

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

列为非零的非零指数