2

この小さな問題は、少なくとも何千回も繰り返さなければならない大きなコードのボトルネックであるため、ここでの主な問題は速度です。

たとえば、数値のベクトルがあります。

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

次のような 3 つの行列が得られます。

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 秒かかります。次のステップは簡単です。

私が得たのは3つのマトリックスです:

  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

このプロセスをスピードアップする必要があります。ダブルフォーまたはラップリーがこれを遅くしていると思います。誰かが助けを投稿できれば、私はそれを感謝します。

ありがとうございました。

4

1 に答える 1

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。そのため、より高速なアナログを探索することをお勧めします。たとえば、combn の高速バージョンを参照してください。

于 2016-05-13T16:20:50.797 に答える