首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速Combn到ID矩阵R

加速Combn到ID矩阵R
EN

Stack Overflow用户
提问于 2016-05-13 23:51:53
回答 1查看 147关注 0票数 2

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

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

代码语言:javascript
复制
v <- c(1,3,5)

我想知道我可以对这个子集进行的所有组合。并将它们设置为0和1的矩阵,例如:

代码语言:javascript
复制
 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 (我认为这是最快的干净利落的方法,对吧?)

代码语言:javascript
复制
matrix <- lapply(seq(length(v)),function(i){
              submatrix <- combn(x = 1:length(v), m=i)

#code follows after a brief explanation

我将获得三个矩阵,例如:

代码语言:javascript
复制
1  2  3

1  1  2
2  3  3

1
2
3

所以为了得到1和0的矩阵,我用一个双精度的for来填充它。(这里可能是我可以获得一些速度的地方)

代码语言:javascript
复制
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秒。下一步很简单。

我得到的是三个矩阵:

代码语言:javascript
复制
  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   

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

代码语言:javascript
复制
final_matrix <- list_matrix[[1]]

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

这样做的作用是粘贴要获取的列。耗时0.0033秒:

代码语言:javascript
复制
 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

我需要加快这个过程。我认为for或的替身正在减慢速度。如果有人能提供一些帮助,我将不胜感激。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-05-14 00:20:51

你可以使用tabulate来简化你的代码:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37214369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档