【发布时间】:2016-03-29 14:05:20
【问题描述】:
我有一个矩阵列表(列数相同),比如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
也就是说,每次每个矩阵一行。 我会很感激任何其他算法这样做。
【问题讨论】:
-
您想对所有矩阵进行成对组合吗?
-
不是成对的。正如我所说,所有矩阵中所有不同的行组合。每次每个矩阵一行。
-
也许这更适合CodeReview 或Programmers,因为您似乎正在寻找替代算法?
-
@JasonAizkalns 在引用其他网站时,指出cross-posting is frowned upon 通常会有所帮助
-
谢谢@gnat——我想我的建议应该更明确。当我说“更适合”时,我的意思是关闭 SO,然后打开/迁移到其他网站之一。
标签: r matrix combinations