在R中生成所有矩阵组合的和并命名以便后续调用
问题描述
我有多个计数变量类型的矩阵,示例如下:
P <- matrix(c(1, 2 ,0, 2, 5, 1, 0, 6, 1), nrow = 3) Q <- matrix(c(1, 0, 0, 2, 3, 1, 0, 4, 1), nrow = 3) R <- matrix(c(2, 1, 1, 5, 6, 4, 0, 4, 1), nrow = 3) S <- matrix(c(9, 7, 5, 4, 7, 3, 2, 6, 3), nrow = 3)
需要生成这些矩阵所有可能的相加组合(比如P+Q、P+R、P+Q+R等)。手动实现示例:
PQ <- P+Q > PQ [,1] [,2] [,3] [1,] 2 4 0 [2,] 2 8 10 [3,] 0 2 2 PQR <- P+Q+R > PQR [,1] [,2] [,3] [1,] 4 9 0 [2,] 3 14 14 [3,] 1 6 3
但实际有9个矩阵,对应501种组合,手动编写效率极低。尝试了以下代码,但无法识别每个组合对应的矩阵:
# generate all possible combinations of the matrices combs <- combn(list(P, Q, R, S), 2, simplify = FALSE) print(combs) # sum the matrices in each combination sums <- lapply(combs, function(x) Reduce("+", x)) # print the result print(sums)
请问如何实现矩阵相加,同时让结果名称反映对应矩阵组合,方便后续调用?
解决方案
步骤1:用命名列表存储矩阵
先把所有矩阵存入命名列表,这样后续能直接获取每个矩阵的名称:
mat_list <- list(P = P, Q = Q, R = R, S = S)
步骤2:生成所有非空子集组合
遍历从2到总矩阵数的子集大小,生成所有可能的矩阵名称组合:
# 生成所有大小≥2的矩阵名称组合 all_combs <- lapply(2:length(mat_list), function(k) { combn(names(mat_list), k, simplify = FALSE) }) # 把嵌套列表展开为一维列表 all_combs <- unlist(all_combs, recursive = FALSE)
步骤3:计算组合和并命名结果
遍历每个组合,取出对应矩阵求和,同时用矩阵名称拼接成结果的名字:
# 计算每个组合的矩阵和 result_list <- lapply(all_combs, function(nms) { Reduce("+", mat_list[nms]) }) # 给结果列表命名(比如c("P","Q")会被命名为"PQ") names(result_list) <- sapply(all_combs, paste, collapse = "")
步骤4:直接调用结果
现在可以通过拼接后的名称直接调用对应矩阵和:
# 调用P+Q的结果 result_list$PQ # 调用P+Q+R的结果 result_list$PQR
完整代码示例
# 定义矩阵 P <- matrix(c(1, 2 ,0, 2, 5, 1, 0, 6, 1), nrow = 3) Q <- matrix(c(1, 0, 0, 2, 3, 1, 0, 4, 1), nrow = 3) R <- matrix(c(2, 1, 1, 5, 6, 4, 0, 4, 1), nrow = 3) S <- matrix(c(9, 7, 5, 4, 7, 3, 2, 6, 3), nrow = 3) # 存入命名列表 mat_list <- list(P = P, Q = Q, R = R, S = S) # 生成所有大小≥2的矩阵名称组合 all_combs <- lapply(2:length(mat_list), function(k) { combn(names(mat_list), k, simplify = FALSE) }) all_combs <- unlist(all_combs, recursive = FALSE) # 计算组合和并命名 result_list <- lapply(all_combs, function(nms) { Reduce("+", mat_list[nms]) }) names(result_list) <- sapply(all_combs, paste, collapse = "") # 示例调用 print(result_list$PQ) print(result_list$PQR)
内容的提问来源于stack exchange,提问作者Rosalin August
相关产品推荐
相关产品推荐

