我是R语言的初学者,从你们那里得到一些提示会很高兴。
我需要创建所有可能的矩阵组合的列表,其中元素将为0和1。这些矩阵需要具有相同数量的行和列。
例如,在2x2矩阵的情况下,将有4 ^ 2 = 16种可能性。
答案 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()