2016-05-13 70 views
1

这个小问题是一个大码必须重复至少几千次的瓶颈,所以这里的主要问题是速度。加速合并到ID矩阵R

我有号码的载体,例如:

v <- c(1,3,5) 

我想知道所有的组合,我可以与子做。并将它们设置在0和1周的例如矩阵:

col1 col2 col3 col4 col5 col6 col7 
1 1 0 0 1 1 0 1 
3 0 1 0 1 0 1 1 
5 0 0 1 0 1 1 1 

其实我使用的功能combn(我认为是做清洁的最快方法,对吗?)

matrix <- lapply(seq(length(v)),function(i){ 
       submatrix <- combn(x = 1:length(v), m=i) 

#code follows after a brief explanation 

我会得到三个矩阵,如:

1 2 3 

1 1 2 
2 3 3 

1 
2 
3 

因此,要获得1和0的矩阵,我填充它为双。 (这里可能是我可以加快速度)

list_matrix <- lapply(seq(length(v)),function(i){ 
    submatrix <- combn(x = 1:length(v), m=i) 
    1matrix <- matrix(data = 0, nrow = length(v), ncol = dim(submatrix)[2]) 

    for(k in seq(dim(submatrix)[2])) 
     for(j in seq(dim(submatrix)[1])) 
      1matrix[submatrix[j,k],k] <- 1 

    return(1matrix) })  

我所展示的是代码最慢的部分。对于这个例子需要约0.012秒。下一步很简单。

我已经得到的三个矩阵:

col1 col2 col3 
1 1 0 0 
3 0 1 0 
5 0 0 1 

    col1 col2 col3 
1 1 1 0 
3 1 0 1 
5 0 1 1 

    col1 
1 1 
3 1 
5 1 

现在这个过程是非常简单和快速。

final_matrix <- list_matrix[[1]] 

for(i in seq(2,length(list_matrix)) 
    final_matrix <- cbind(final_matrix, list_matrix[[i]] 

而这是干什么就是粘贴要获取的列。它需要0.0033 s:

col1 col2 col3 col4 col5 col6 col7 
1 1 0 0 1 1 0 1 
3 0 1 0 1 0 1 1 
5 0 0 1 0 1 1 1 

我需要加快此过程。我认为双人或乐队正在放慢这一点。如果有人可以发布一些帮助,我会感激。

谢谢。

+2

看起来你也可以使用'?expand.grid'如果它适合你的一般问题; 't(expand.grid(rep_len(list(0:1),length(v))))[,-1]' –

+0

我认为它可以工作。谢谢。 –

回答

1

你可以利用tabulate简化代码:

L <- sapply(1:length(v), function(i) combn(length(v),i,FUN=tabulate,nbins=length(v))) 
do.call(cbind,L) 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
#[1,] 1 0 0 1 1 0 1 
#[2,] 0 1 0 1 0 1 1 
#[3,] 0 0 1 0 1 1 1 

注意combn本身是缓慢的,所以你可能要探讨其更快的类似物,例如见Faster version of combn

+0

我会检查出来。谢谢。 –