R:多个矩阵的最小列值更快?

时间:2015-03-14 16:54:03

标签: r

我有一个非常高的整数矩阵(mat)和一个等长行的稀疏二进制向量(v)。我想在mat的所有列中找到最小值,其中v == 1。

以下是几种可能的解决方案:

mat <- matrix(as.integer(runif(100000*100,0,2^31)),nrow=100000,ncol=100)
v<-(rbinom(100000,1,.01))

a<-apply(v*mat,2, function(x) min(x[x>0]))
b<-apply(mat,2,function(x) min(x[v==1]))
c<-sapply(subset(data.frame(mat),v==1), min)

这些都很好,在我的机器上解决方案c似乎最快(一个老旧的,速度较慢的MacBook)。但是如果我有一个函数可以提供唯一的v集合,则计算时间会与集合的数量成线性关系。因此,大量独特集合(> 10,000)将需要数小时才能处理。

有关如何更快地完成此类操作的任何想法,还是我能够尽可能快地完成此操作?

1 个答案:

答案 0 :(得分:1)

我认为,由于apply几乎总是为0,因此子集化然后调用v会获得很多收益:

system.time(b<-apply(mat[as.logical(v),],2, min))
#  user  system elapsed 
# 0.012   0.000   0.013
 system.time(a<-apply(v*mat,2, function(x) min(x[x>0])))
#  user  system elapsed 
# 0.628   0.019   0.649 
identical(a,b)
#[1] TRUE

我也放弃了x[x>0],因为mat似乎总是大于0。