【问题标题】:Speed up Combn to ID matrix R加速 Combn 到 ID 矩阵 R
【发布时间】:2016-05-13 15:51:52
【问题描述】:

这个小问题是大代码的瓶颈,必须重复至少数千次,所以这里的主要问题是速度。

我有一个数字向量,例如:

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 的矩阵,我用 double for 填充它。 (这可能是我可以加快速度的地方)

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 秒:

 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

我需要加快这个过程。我认为 double for 或 lapply 正在减慢这一速度。如果有人可以发布一些帮助,我将不胜感激。

谢谢。

【问题讨论】:

  • 如果它适合您的一般问题,您似乎也可以使用?expand.gridt(expand.grid(rep_len(list(0:1), length(v))))[, -1]
  • 我认为它可以工作。谢谢。

标签: r performance combinations combn


【解决方案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

【讨论】:

  • 我去看看。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-11-23
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 2015-10-18
相关资源
最近更新 更多