【问题标题】:How to create a matrix from all possible combinations of 2 or more matrices?如何从 2 个或更多矩阵的所有可能组合中创建矩阵?
【发布时间】:2021-09-22 04:07:14
【问题描述】:

假设有两个矩阵:

A <- B <- diag(3)  
> A
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

我想创建一个新矩阵 AB,它由 A 行和 B 行的所有可能组合组成。预期结果:

> AB
      [,1] [,2] [,3] [,4] [,5] [,6]
 [1,]    1    0    0    1    0    0
 [2,]    1    0    0    0    1    0
 [3,]    1    0    0    0    0    1
 [4,]    0    1    0    1    0    0
 [5,]    0    1    0    0    1    0
 [6,]    0    1    0    0    0    1
 [7,]    0    0    1    1    0    0
 [8,]    0    0    1    0    1    0
 [9,]    0    0    1    0    0    1

如何有效地做到这一点?它可以扩展到两个以上的矩阵吗?

【问题讨论】:

    标签: r matrix combinations combinatorics


    【解决方案1】:

    您可以使用expand.grid() 并将其输出用于索引矩阵 A 和 B,

    x <- expand.grid(1:3,1:3)
    
    cbind(A[x[,1],], B[x[,2],])
    

    给予,

         [,1] [,2] [,3] [,4] [,5] [,6]
     [1,]    1    0    0    1    0    0
     [2,]    0    1    0    0    1    0
     [3,]    0    0    1    0    0    1
     [4,]    1    0    0    1    0    0
     [5,]    0    1    0    0    1    0
     [6,]    0    0    1    0    0    1
     [7,]    1    0    0    1    0    0
     [8,]    0    1    0    0    1    0
     [9,]    0    0    1    0    0    1
    

    编辑:

    对于两个以上的矩阵,您可以使用如下函数,

    myfun <- function(...) {
    
         arguments <- list(...)
    
         a <- expand.grid(lapply(arguments, function(x) 1:nrow(x)))
        
        
         do.call(cbind,lapply(seq(a),function(x) { arguments[[x]][a[,x],] }))
    
     
    }
    
    out <- myfun(A,B,C)
    
    head(out)
    

    给予,

         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    [1,]    1    0    0    1    0    0    1    0    0     0
    [2,]    0    1    0    1    0    0    1    0    0     0
    [3,]    0    0    1    1    0    0    1    0    0     0
    [4,]    1    0    0    0    1    0    1    0    0     0
    [5,]    0    1    0    0    1    0    1    0    0     0
    [6,]    0    0    1    0    1    0    1    0    0     0
    

    数据:

    A <- B <- diag(3)
    C <- diag(4)
    

    【讨论】:

    • 当有 2 个矩阵时这是可以接受的。如何将其推广到 2 个以上的矩阵?
    • 看起来很完美。谢谢
    • 在遇到内存问题之前,它在我的计算机中最多可以处理 15 个矩阵。不幸的是,我至少需要 18 个矩阵。你能建议任何值得尝试的方法吗?谢谢
    • 我不太确定。也许data.table::CJ 可以比expand.grid() 更节省内存。还有另一个包ffbase 具有expand.ffgrid() 功能。但同样,我不能确定内存问题。您可能想通过引用这个来在另一个问题中问它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多