如何从 2 个或更多矩阵的所有可能组合中创建矩阵?
Posted
技术标签:
【中文标题】如何从 2 个或更多矩阵的所有可能组合中创建矩阵?【英文标题】:How to create a matrix from all possible combinations of 2 or more matrices? 【发布时间】: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
如何有效地做到这一点?它可以扩展到两个以上的矩阵吗?
【问题讨论】:
【参考方案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()
功能。但同样,我不能确定内存问题。您可能想通过引用这个来在另一个问题中问它。以上是关于如何从 2 个或更多矩阵的所有可能组合中创建矩阵?的主要内容,如果未能解决你的问题,请参考以下文章