生成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——我想我应该在我的建议中更加明确。当我说“更适合”时,我的意思是,关闭它,然后打开/迁移到其他站点之一。感谢您的解决方案。嗯,算法(或多或少)是相同的,计算方式在这里改变了。虽然我认为这是一个很好的解决方案,但我更感兴趣的是提出不同的算法。啊,好吧,我现在明白了!