【问题标题】:Generating all combinations of rows of matrices (brute force) in R在R中生成矩阵行的所有组合(蛮力)
【发布时间】: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

也就是说,每次每个矩阵一行。 我会很感激任何其他算法这样做。

【问题讨论】:

  • 您想对所有矩阵进行成对组合吗?
  • 不是成对的。正如我所说,所有矩阵中所有不同的行组合。每次每个矩阵一行。
  • 也许这更适合CodeReviewProgrammers,因为您似乎正在寻找替代算法?
  • @JasonAizkalns 在引用其他网站时,指出cross-posting is frowned upon 通常会有所帮助
  • 谢谢@gnat——我想我的建议应该更明确。当我说“更适合”时,我的意思是关闭 SO,然后打开/迁移到其他网站之一。

标签: r matrix combinations


【解决方案1】:

这是另一种解决方案,我稍微更改了示例以使其更具重现性:

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, ]))

【讨论】:

  • 感谢您的解决方案。好吧,算法(或多或少)是相同的,并且这里的计算方式发生了变化。虽然我认为这是一个很好的解决方案,但我更感兴趣的是看到提出不同的算法。
  • 啊,好的,我明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多