如何从2个或多个矩阵的所有可能组合中创建矩阵?

3

假设有两个矩阵:

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

如何高效地完成这项任务?并且这种方法是否可以应用于超过两个矩阵的情况?

1个回答

5

您可以使用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)

当有两个矩阵时,这是可以接受的。我如何将其推广到超过两个矩阵? - Rel_Ai
看起来完美。谢谢。 - Rel_Ai
在我的电脑上,最多可以处理15个矩阵,效果相当不错,但是当处理18个矩阵时会遇到内存问题。不幸的是,我需要处理至少18个矩阵。你能否建议一些值得尝试的解决方法?谢谢。 - Rel_Ai
我不是很确定。也许 data.table::CJexpand.grid() 更节省内存。还有另一个包 ffbase,其中有 expand.ffgrid() 函数。但是,关于内存问题,我不能确定。您可能需要参考这个问题,提出另一个问题来询问。 - maydin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接