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

生成R中矩阵行的所有组合(蛮力),r,matrix,combinations,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

我有一个矩阵列表(列数相同),比如说
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
也就是说,每次每个矩阵一行。
我希望其他算法也能这样做。

这里是另一个解决方案,我对示例做了一点修改,使其更具可复制性:

ones <- t(rep(1, 4))
lst_Mat <- list(1:6 %*% ones, 7:11 %*% ones, 12:21 %*% ones, 22:26 %*% ones)

combs <- expand.grid( sapply(lst_Mat, function(x) 1:nrow(x)) )
nbcombs <- nrow(combs)

res <- NULL
for (i in 1:nbcombs)
   res[[i]] <- t(mapply(function(mat,line) mat[line,], lst_Mat, combs[i, ]))

one你想在所有矩阵上进行成对组合吗?不是成对组合。正如我所说,所有矩阵中所有不同的行组合。每个矩阵一行,每次一行。也许这更适合,或者因为你似乎在寻找替代算法?@JasonAizkalns在提到其他网站时,经常有助于指出感谢@gnat——我想我应该在我的建议中更加明确。当我说“更适合”时,我的意思是,关闭它,然后打开/迁移到其他站点之一。感谢您的解决方案。嗯,算法(或多或少)是相同的,计算方式在这里改变了。虽然我认为这是一个很好的解决方案,但我更感兴趣的是提出不同的算法。啊,好吧,我现在明白了!