R: матричная комбинация с определенным количеством значений - PullRequest
1 голос
/ 08 марта 2019

Я хочу сделать все комбинации моей Матрицы.
Пример.двоичная матрица 5 X 5, где у меня есть только две строки 1 (см. ниже)

Com 1:

1 1 0 0 0   
1 1 0 0 0    
1 1 0 0 0  
1 1 0 0 0   
1 1 0 0 0  

Com 2:

1 0 1 0 0  
1 1 0 0 0  
1 1 0 0 0  
1 1 0 0 0   
1 1 0 0 0  

.,.

Com?:

0 0 0 1 1  
0 0 0 1 1  
0 0 0 1 1  
0 0 0 1 1  
0 0 0 1 1  

Я пытался использовать пакет Combination в R, но не смог найти решение.

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Используя RcppAlgos (я автор), мы можем сделать это за 2 вызова.Это также довольно быстро:

library(tictoc)
library(RcppAlgos)

tic("RcppAlgos solution")

## First we generate the permutations of the multiset c(1, 1, 0, 0, 0)
binPerms <- permuteGeneral(1:0, 5, freqs = c(2, 3))

## Now we generate the permutations with repetition choose 5
## and select the rows from binPerms above
allMatrices <- permuteGeneral(1:nrow(binPerms), 5, 
                              repetition = TRUE, 
                              FUN = function(x) {
                                  binPerms[x, ]
                              })
toc()
RcppAlgos solution: 0.108 sec elapsed

Вот вывод:

allMatrices[1:3]
[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    0    0    0
[2,]    1    1    0    0    0
[3,]    1    1    0    0    0
[4,]    1    1    0    0    0
[5,]    1    1    0    0    0

[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    0    0    0
[2,]    1    1    0    0    0
[3,]    1    1    0    0    0
[4,]    1    1    0    0    0
[5,]    1    0    1    0    0

[[3]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    0    0    0
[2,]    1    1    0    0    0
[3,]    1    1    0    0    0
[4,]    1    1    0    0    0
[5,]    1    0    0    1    0


len <- length(allMatrices)
len
[1] 100000

allMatrices[(len - 2):len]
[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    1    1
[2,]    0    0    0    1    1
[3,]    0    0    0    1    1
[4,]    0    0    0    1    1
[5,]    0    0    1    1    0

[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    1    1
[2,]    0    0    0    1    1
[3,]    0    0    0    1    1
[4,]    0    0    0    1    1
[5,]    0    0    1    0    1

[[3]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    1    1
[2,]    0    0    0    1    1
[3,]    0    0    0    1    1
[4,]    0    0    0    1    1
[5,]    0    0    0    1    1    
0 голосов
/ 08 марта 2019

Код, который я написал ниже, работал для меня. Список 100 000 5х5 матриц. В каждой строке есть два места, равные 1.

n <- 5 # No of columns
k <- 2 # No. of ones
m <- 5  # No of rows in matrix

nck <- combn(1:n,k,simplify = F)
possible_rows <-lapply(nck,function(x){
  arr <- numeric(n)
  arr[x] <- 1
  matrix(arr,nrow=1)
})

mat_list <- possible_rows
for(i in 1:(m-1)){
  list_of_lists <- lapply(mat_list,function(x){
    lapply(possible_rows,function(y){
      rbind(x,y)
    })
  })
  mat_list <- Reduce(c,list_of_lists)
  print(c(i,length(mat_list)))
}
...