【问题标题】:Matrix columns combination algorithm矩阵列组合算法
【发布时间】:2022-10-24 11:42:42
【问题描述】:

我尝试通过 R 的矩阵列进行所有组合,如下所示 首先,我有一个 4*3 矩阵,如下所示

> a
     [,1] [,2] [,3] [,4]
[1,]    1    0    1    1
[2,]    1    0    0    0
[3,]    1    1    1    1

然后我们要列出总共 3 个12*2 = 12 组合,如下例 一个例子是

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

第二个例子是

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

一列只有一个数字。 目前,我已经列出了每种列类型,例如

> whole.combination
[[1]]
     b b b
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1

[[2]]
     b
[1,] 0
[2,] 0
[3,] 1

[[3]]
     b b
[1,] 1 0
[2,] 0 0
[3,] 0 1

[[4]]
     b b
[1,] 1 0
[2,] 0 0
[3,] 0 1

但是,虽然我可以手动使用 cbind 生成一个

> cbind(a[[1]][,1],a[[2]][,1],a[[3]][,1],a[[4]][,1])
     [,1] [,2] [,3] [,4]
[1,]    1    0    1    1
[2,]    0    0    0    0
[3,]    0    1    0    0

如何将每个矩阵的每一列组合起来生成一个 4*3 矩阵?但是,它是否有任何有效的方法可以一次列出所有组合? 因此,如果我用 n*m 矩阵扩展这个问题,我需要一种算法来生成这些矩阵组合。 谢谢

【问题讨论】:

  • 输入修改 - 我们要列出总数312*2 = 12我们要列出总计的组合3*1*2*2 = 12组合
  • 问题不清楚。假设输入是矩阵a,那么其他矩阵的第 1 列在哪里?以及如何获得产品3*1*2*2?我可以理解4+3*2*1,第一列有4个选择,第二列有3个,第三列有2个,最后一列只剩下一个选择。

标签: r


【解决方案1】:

我想我明白你在做什么。首先你正在生成 34个矩阵(行列)不是 4*3 矩阵。其次,您将示例矩阵称为a,将列表称为whole.combination,但您的代码将此列表称为a。我将调用列表b。首先使用dput() 使数据可重现:

b <- list(structure(c(1, 0, 0, 0, 1, 0, 0, 0, 1), dim = c(3L, 3L)), 
     structure(c(0, 0, 1), dim = c(3L, 1L)), structure(c(1, 0, 
     0, 0, 0, 1), dim = 3:2), structure(c(1, 0, 0, 0, 0, 1), dim = 3:2))

您的目标是通过从列表b 的 4 部分中的每一部分中取出 1 列来制作所有 3*4 矩阵组合。首先我们需要组合:

cmbs <- expand.grid(1:3, 1, 1:2, 1:2)

现在计算result,它是一个包含 12 个 3*4 矩阵的列表,表示列表 b 中四个矩阵的列组合:

result <- lapply(1:12, function(i) cbind(b[[1]][, cmbs[i, 1]], b[[2]][, cmbs[i, 2]],
          b[[3]][, cmbs[i, 3]], b[[4]][, cmbs[i, 4]]))
result
# [[1]]
#      [,1] [,2] [,3] [,4]
# [1,]    1    0    1    1
# [2,]    0    0    0    0
# [3,]    0    1    0    0
#         . . . . .
# [[12]]
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    0
# [2,]    0    0    0    0
# [3,]    1    1    1    1

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 2017-05-03
    • 2019-10-11
    • 1970-01-01
    • 2013-04-13
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多