3

20 X 5 の行列があるとします。行列のサブセットを選択し、それらを使って計算を行いたいと思います。さらに、各サブマトリックスが 7 X 5 であると仮定します。もちろんできます

ncomb <- combn(20, 7)

これにより、7 つの行インデックスのすべての可能な組み合わせが得られ、これらを使用して部分行列を取得できます。しかし、20 X 5 の小さなマトリックスでは、すでに 77520 通りの組み合わせが可能です。そのため、代わりに、組み合わせのいくつか、たとえば 5000 個をランダムにサンプリングしたいと思います。

1 つの可能性は次のとおりです。

ncomb <- combn(20, 7)
ncombsub <- ncomb[, sample(77520, 5000)]

つまり、考えられるすべての組み合わせを取得し、そのうちの 5000 の組み合わせだけをランダムに選択します。しかし、100 X 7 など、より大きな行列がある場合、考えられるすべての組み合わせを計算するのは難しいと思います。

したがって、最初にすべての可能な組み合わせを取得せずに、組み合わせのサブセットを取得する方法があるかどうか疑問に思います。

4

2 に答える 2

3

combn()を変更し、コードをバイトコンパイルすることにより、@Rolandが提案したことを実行しました。

combn_sub <- function (x, m, nset = 5000, seed=123, simplify = TRUE, ...) {
    stopifnot(length(m) == 1L)
    if (m < 0) 
        stop("m < 0", domain = NA)
    if (is.numeric(x) && length(x) == 1L && x > 0 && trunc(x) == 
        x) 
        x <- seq_len(x)
    n <- length(x)
    if (n < m) 
        stop("n < m", domain = NA)
    m <- as.integer(m)
    e <- 0
    h <- m
    a <- seq_len(m)
    len.r <- length(r <-  x[a] )
    count <- as.integer(round(choose(n, m)))
    if( count < nset ) nset <- count
    dim.use <- c(m, nset)       

    ##-----MOD 1: Change the output matrix size--------------
    out <- matrix(r, nrow = len.r, ncol = nset) 

    if (m > 0) {
        i <- 2L
        nmmp1 <- n - m + 1L

        ##----MOD 2: Select a subset of indices
        set.seed(seed)
        samp <- sort(c(1, sample( 2:count, nset - 1 )))  

        ##----MOD 3: Start a counter.
        counter <- 2L    

        while (a[1L] != nmmp1 ) {
            if (e < n - h) {
                h <- 1L
                e <- a[m]
                j <- 1L
            }
            else {
                e <- a[m - h]
                h <- h + 1L
                j <- 1L:h
            }
            a[m - h + j] <- e + j

            #-----MOD 4: Whenever the counter matches an index in samp, 
            #a combination of row indices is produced and stored in the matrix `out`
            if(samp[i] == counter){ 
                out[, i] <- x[a]
                if( i == nset ) break
                i <- i + 1L
            }
            #-----Increase the counter by 1 for each iteration of the while-loop
            counter <- counter + 1L
        }
    }
    array(out, dim.use)
}

library("compiler")
comb_sub <- cmpfun(comb_sub)
于 2013-08-18T18:07:33.673 に答える