gpt4 book ai didi

r - 如何cbind R中矩阵列表的所有行组合

转载 作者:行者123 更新时间:2023-12-04 01:40:49 24 4
gpt4 key购买 nike

我有一个矩阵列表。此列表的长度未知(尽管在我的示例中我使用了 3 个 2x2 矩阵的列表)。

[[1]]
[,1] [,2]
[1,] 1 1
[2,] 2 2

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

[[3]]
[,1] [,2]
[1,] 5 5
[2,] 6 6

我想从这个列表中生成一个矩阵,该矩阵包含列表中每个矩阵的行的所有可能组合。 IE。我想要这个作为输出:

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

我看过其他示例(例如,我喜欢使用 expand.grid),但所有示例都倾向于扩展行元素的组合或应用一些我无法适应的其他功能。

另外 - 需要处理任何大小的矩阵列表。

我有一个解决方案,但我确信一定有更好/更短/更优雅/更快的解决方案隐藏在某处。你能帮我找到吗?

这是我的代码:

# New matrix will be stored in here.
# Don't like but is there a better way?
m.combs <- c()

expand.grid.2 <- function(lst) {

if (is.null(m.combs)) {

m.combs <<- lst

} else {

m.current <- m.combs
n <- nrow(m.combs)

for (i in 1:nrow(lst)) {

if(i == 1) # for first iteration cbind new matrix
m.combs <<- cbind(m.combs, matrix(rep(lst[i, ], each = n), nrow = n))
else # for next iterations rbind new matrix
m.combs <<- rbind(m.combs, cbind(m.current, matrix(rep(lst[i, ], each = n), nrow = n)))
}
}
}

m1 <- matrix(c(1,1,2,2), nrow = 2, ncol = 2, byrow = TRUE)
m2 <- matrix(c(3,3,4,4), nrow = 2, ncol = 2, byrow = TRUE)
m3 <- matrix(c(5,5,6,6), nrow = 2, ncol = 2, byrow = TRUE)
lst <- list(m1, m2, m3)

rapply(lst, expand.grid.2)
print(m.combs)

最佳答案

这是一种可能的方法:

## get indices of all row combinations
m.combs <- expand.grid(lapply(l, function(x) seq_len(nrow(x))))

## extract rows and combine into matrix
do.call(cbind, Map(function(x, y) x[y, ], l, m.combs))
#> [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,] 1 1 3 3 5 5
#> [2,] 2 2 3 3 5 5
#> [3,] 1 1 4 4 5 5
#> [4,] 2 2 4 4 5 5
#> [5,] 1 1 3 3 6 6
#> [6,] 2 2 3 3 6 6
#> [7,] 1 1 4 4 6 6
#> [8,] 2 2 4 4 6 6

首先使用 expand.grid 获取对应于我们希望生成的所有组合的行索引(每个列表元素)。其次,提取相应的行并将它们组合成一个矩阵。

数据

mat <- matrix(rep(1:6, 2), ncol = 2)
l <- list(mat[1:2, ], mat[3:4, ], mat[5:6, ])

关于r - 如何cbind R中矩阵列表的所有行组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57508352/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com