Условные комбинации матриц в r - PullRequest
0 голосов
/ 21 ноября 2018

Как создать все двоичные комбинации матриц с условием, что в столбце и строке может быть только один 1.Пример прояснит.Этот конкретный пример должен иметь 6 матриц комбинаций, я показываю только первые 2.

c1 <- matrix(c(1, 0, 0, 0, 1, 0, 0, 0, 1), nrow = 3) #First combination
c2 <- matrix(c(0, 1, 0, 1, 0, 0, 0, 0, 1), nrow = 3) #Second combination

1 Ответ

0 голосов
/ 21 ноября 2018

То, что вы просите, эквивалентно нахождению всех перестановок length = n, где n = nrow(c1) (или c2 выше).Используя FUN аргумент permuteGeneral из RcppAlgos (я автор), мы можем легко сгенерировать желаемый результат:

n <- 3L
myIdentity <- diag(nrow = n)

library(RcppAlgos)
permuteGeneral(n, n, FUN = function(x) myIdentity[x, ])
[[1]]
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

[[2]]
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    0    1
[3,]    0    1    0

[[3]]
     [,1] [,2] [,3]
[1,]    0    1    0
[2,]    1    0    0
[3,]    0    0    1

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

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

[[6]]
     [,1] [,2] [,3]
[1,]    0    0    1
[2,]    0    1    0
[3,]    1    0    0

Существует много других способов генерации запрошенного вывода.В частности, используя проверенный и действительный пакет combinat, мы можем получить аналогичный результат (выходные данные будут в другом порядке):

combinat::permn(3, fun = function(x) myIdentity[x, ])

Теперь, когда мы уменьшили проблему до простой генерации перестановокмы можем использовать любой из лучших пакетов (arrangements, gtools, multicool, partitions и т. д.) для генерации перестановок, чтобы получить желаемый результат с помощью lapply:

library(arrangements)
myPerms <- permutations(n)
lapply(1:nrow(myPerms), function(x) myIdentity[myPerms[x,], ])
...