在R中生成矩阵行(蛮力)的所有组合

时间:2016-03-29 14:05:21

标签: r matrix combinations

我有一个矩阵列表(列数相同),比如lst_Mat,我想在此列表中包含矩阵的所有行方式组合。例如,lst_Mat可能是这样的:

> lst_Mat
 [[1]]
      [,1] [,2] [,3] [,4]
 [1,]    1    2    3    4
 [2,]    1    3    2    4
 [3,]    1    3    4    2
 [4,]    2    1    3    4
 [5,]    2    3    1    4
 [6,]    2    3    4    1

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

[[3]]
      [,1] [,2] [,3] [,4]
 [1,]    1    2    3    4
 [2,]    1    2    4    3
 [3,]    1    3    2    4
 [4,]    1    3    4    2
 [5,]    1    4    2    3
 [6,]    1    4    3    2
 [7,]    2    1    3    4
 [8,]    2    1    4    3
 [9,]    2    3    1    4
[10,]    3    1    2    4

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

因此,组合的总数将为6*4*10*5=1200。该问题类似于产生具有特定长度的所有可能的英文字母串(即a,b,c,...,x,y,z)的问题。例如:aaa, aab, aac,..., aaz, aba, abb,..., abz, aca,...等等。

我提出了以下解决方案:

lst_Mat_len=list()
C=ncol(lst_Mat[[1]])
for (i in 1:length(lst_Mat))
    lst_Mat_len[[length(lst_Mat_len)+1]]=(1:nrow(lst_Mat[[i]]))

combs=do.call(expand.grid, lst_Mat_len)

for (i in 1:nrow(combs)){
    M=matrix(0, 0, C)
    for (j in 1:ncol(combs))
        M=rbind(M, lst_Mat[[j]][combs[i,j],])

    # print(M)
}

M的示例输出:

> M
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    3    2    4
[3,]    1    2    3    4
[4,]    2    1    4    3

> M
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    3    2    4
[3,]    1    2    3    4
[4,]    2    3    1    4

也就是说,每次每个矩阵一行。 我感谢任何其他算法。

1 个答案:

答案 0 :(得分:2)

这是另一个解决方案,我改变了一些示例,使其更具可重复性:

{{1}}