如何从2个及以上矩阵的所有可能行组合创建新矩阵?
两个矩阵场景的高效实现
你可以直接用R内置的expand.grid生成行索引的全组合,再通过矩阵索引拼接,全程是向量化操作,效率远高于手动循环:
# 初始化示例矩阵 A <- B <- diag(3) # 生成两个矩阵行的所有组合索引 row_pairs <- expand.grid(A_row = 1:nrow(A), B_row = 1:nrow(B)) # 按索引取行后拼接 AB <- cbind(A[row_pairs$A_row, ], B[row_pairs$B_row, ])
运行后输出的AB和你给出的预期结果完全一致。
多矩阵场景的扩展
该方案完全可以扩展到任意多个矩阵的场景,你可以把逻辑封装成通用函数,输入任意数量的矩阵即可自动生成拼接结果:
# 通用多矩阵行全组合拼接函数 combine_all_row_pairs <- function(...) { input_mats <- list(...) # 校验输入全部为矩阵 stopifnot(all(vapply(input_mats, is.matrix, logical(1)))) # 生成所有矩阵的行索引全组合 all_row_idx <- expand.grid(lapply(input_mats, function(mat) seq_len(nrow(mat)))) # 按索引取行后拼接所有矩阵 do.call(cbind, lapply(seq_along(input_mats), function(i) input_mats[[i]][all_row_idx[[i]], ])) } # 测试3个矩阵的场景 C <- diag(3) ABC <- combine_all_row_pairs(A, B, C)
这个方案的性能优势很明显,因为expand.grid和矩阵索引都是R底层C语言实现的,就算矩阵行数较多、输入矩阵数量多,也能保持很高的运行效率。
内容的提问来源于stack exchange,提问作者Rel_Ai
相关产品推荐
相关产品推荐

