使用0和1s R语言的所有组合创建(NxN)martices列表

时间:2016-04-05 17:26:34

标签: r list matrix

我是R语言的初学者,从你们那里得到一些提示会很高兴。

我需要创建所有可能的矩阵组合的列表,其中元素将为0和1。这些矩阵需要具有相同数量的行和列。

例如,在2x2矩阵的情况下,将有4 ^ 2 = 16种可能性。

1 个答案:

答案 0 :(得分:3)

您的问题激发我尝试编写一个通用函数,该函数可以生成nr所有维{8}的矩阵列表,该列表可以使用给定向量{{1}的元素形成}。结果如下:

nc

以下是如何使用它来生成所需的二进制2x2矩阵:

x

请注意,这导致输出与@alexis_laz在其评论中给出的聪明解决方案相同:

allmatrices <- function(x,nr,nc,...) {
    nx <- length(x);
    divs <- nx^seq(0L,nr*nc-1L);
    lapply(seq(0L,nx^(nr*nc)-1L),function(i) matrix(x[i%/%divs%%nx+1L],nr,...));
}; ## end allmatrices()

这是另一个生成由前三个字母组成的2x3矩阵列表的示例:

allmatrices(0:1,2L,2L);
## [[1]]
##      [,1] [,2]
## [1,]    0    0
## [2,]    0    0
## 
## [[2]]
##      [,1] [,2]
## [1,]    1    0
## [2,]    0    0
## 
## [[3]]
##      [,1] [,2]
## [1,]    0    0
## [2,]    1    0
## 
## [[4]]
##      [,1] [,2]
## [1,]    1    0
## [2,]    1    0
## 
## [[5]]
##      [,1] [,2]
## [1,]    0    1
## [2,]    0    0
## 
## [[6]]
##      [,1] [,2]
## [1,]    1    1
## [2,]    0    0
## 
## [[7]]
##      [,1] [,2]
## [1,]    0    1
## [2,]    1    0
## 
## [[8]]
##      [,1] [,2]
## [1,]    1    1
## [2,]    1    0
## 
## [[9]]
##      [,1] [,2]
## [1,]    0    0
## [2,]    0    1
## 
## [[10]]
##      [,1] [,2]
## [1,]    1    0
## [2,]    0    1
## 
## [[11]]
##      [,1] [,2]
## [1,]    0    0
## [2,]    1    1
## 
## [[12]]
##      [,1] [,2]
## [1,]    1    0
## [2,]    1    1
## 
## [[13]]
##      [,1] [,2]
## [1,]    0    1
## [2,]    0    1
## 
## [[14]]
##      [,1] [,2]
## [1,]    1    1
## [2,]    0    1
## 
## [[15]]
##      [,1] [,2]
## [1,]    0    1
## [2,]    1    1
## 
## [[16]]
##      [,1] [,2]
## [1,]    1    1
## [2,]    1    1

正如您所看到的,此算法实时快速失控。小心!

除了参数化单元格值和维度之外,我还将可变参数传递给matrix()调用,提供了更多的灵活性。因此,例如,您可以填充矩阵identical(allmatrices(0:1,2L,2L),{ n <- 2; lapply(0:(((n*n)^2)-1),function(i) matrix(as.integer(head(intToBits(i),n*n)),n,n)); }); ## [1] TRUE 而不是列,并根据需要传递维名称:

allmatrices(letters[1:3],2L,3L);
## [[1]]
##      [,1] [,2] [,3]
## [1,] "a"  "a"  "a"
## [2,] "a"  "a"  "a"
##
## [[2]]
##      [,1] [,2] [,3]
## [1,] "b"  "a"  "a"
## [2,] "a"  "a"  "a"
##
## [[3]]
##      [,1] [,2] [,3]
## [1,] "c"  "a"  "a"
## [2,] "a"  "a"  "a"
##
## [[4]]
##      [,1] [,2] [,3]
## [1,] "a"  "a"  "a"
## [2,] "b"  "a"  "a"
##
## [[5]]
##      [,1] [,2] [,3]
## [1,] "b"  "a"  "a"
## [2,] "b"  "a"  "a"
##
## [[6]]
##      [,1] [,2] [,3]
## [1,] "c"  "a"  "a"
## [2,] "b"  "a"  "a"
##
## [[7]]
##      [,1] [,2] [,3]
## [1,] "a"  "a"  "a"
## [2,] "c"  "a"  "a"
##
## [[8]]
##      [,1] [,2] [,3]
## [1,] "b"  "a"  "a"
## [2,] "c"  "a"  "a"
##
## [[9]]
##      [,1] [,2] [,3]
## [1,] "c"  "a"  "a"
## [2,] "c"  "a"  "a"
##
## [[10]]
##      [,1] [,2] [,3]
## [1,] "a"  "b"  "a"
## [2,] "a"  "a"  "a"
##
## [[11]]
##      [,1] [,2] [,3]
## [1,] "b"  "b"  "a"
## [2,] "a"  "a"  "a"
##
## ... snip ...
##
## [[719]]
##      [,1] [,2] [,3]
## [1,] "b"  "b"  "c"
## [2,] "c"  "c"  "c"
##
## [[720]]
##      [,1] [,2] [,3]
## [1,] "c"  "b"  "c"
## [2,] "c"  "c"  "c"
##
## [[721]]
##      [,1] [,2] [,3]
## [1,] "a"  "c"  "c"
## [2,] "a"  "c"  "c"
##
## [[722]]
##      [,1] [,2] [,3]
## [1,] "b"  "c"  "c"
## [2,] "a"  "c"  "c"
##
## [[723]]
##      [,1] [,2] [,3]
## [1,] "c"  "c"  "c"
## [2,] "a"  "c"  "c"
##
## [[724]]
##      [,1] [,2] [,3]
## [1,] "a"  "c"  "c"
## [2,] "b"  "c"  "c"
##
## [[725]]
##      [,1] [,2] [,3]
## [1,] "b"  "c"  "c"
## [2,] "b"  "c"  "c"
##
## [[726]]
##      [,1] [,2] [,3]
## [1,] "c"  "c"  "c"
## [2,] "b"  "c"  "c"
##
## [[727]]
##      [,1] [,2] [,3]
## [1,] "a"  "c"  "c"
## [2,] "c"  "c"  "c"
##
## [[728]]
##      [,1] [,2] [,3]
## [1,] "b"  "c"  "c"
## [2,] "c"  "c"  "c"
##
## [[729]]
##      [,1] [,2] [,3]
## [1,] "c"  "c"  "c"
## [2,] "c"  "c"  "c"

性能测试:

byrow

allmatrices(0:1,2L,2L,byrow=T,dimnames=list(letters[3:4],letters[1:2])); ## [[1]] ## a b ## c 0 0 ## d 0 0 ## ## [[2]] ## a b ## c 1 0 ## d 0 0 ## ## [[3]] ## a b ## c 0 1 ## d 0 0 ## ## [[4]] ## a b ## c 1 1 ## d 0 0 ## ## [[5]] ## a b ## c 0 0 ## d 1 0 ## ## [[6]] ## a b ## c 1 0 ## d 1 0 ## ## [[7]] ## a b ## c 0 1 ## d 1 0 ## ## [[8]] ## a b ## c 1 1 ## d 1 0 ## ## [[9]] ## a b ## c 0 0 ## d 0 1 ## ## [[10]] ## a b ## c 1 0 ## d 0 1 ## ## [[11]] ## a b ## c 0 1 ## d 0 1 ## ## [[12]] ## a b ## c 1 1 ## d 0 1 ## ## [[13]] ## a b ## c 0 0 ## d 1 1 ## ## [[14]] ## a b ## c 1 0 ## d 1 1 ## ## [[15]] ## a b ## c 0 1 ## d 1 1 ## ## [[16]] ## a b ## c 1 1 ## d 1 1 / library(microbenchmark); bgoldst <- function() allmatrices(0:1,2L,2L); alexis <- function() { n <- 2; lapply(0:(((n*n)^2)-1),function(i) matrix(as.integer(head(intToBits(i),n*n)),n,n)); }; identical(bgoldst(),alexis()); ## [1] TRUE microbenchmark(bgoldst(),alexis(),times=1000L); ## Unit: microseconds ## expr min lq mean median uq max neval ## bgoldst() 62.865 70.136 80.15788 73.130 77.4060 1029.362 1000 ## alexis() 187.741 205.702 229.48292 217.677 226.8705 1261.150 1000 转换可能会使@ alexis_laz的解决方案花费一些速度。

编辑:播放得很好,@ alexis_laz!你赢了这回合:

intToBits()