如何合并矩阵上下三角并封装为函数?(R语言)
R矩阵合并与函数封装方案
1. 生成新矩阵的实现方式
不用修改原矩阵emp,直接初始化新矩阵分别填充下三角和上三角值:
# 初始化原矩阵 emp <- matrix(nrow = 13, ncol = 13) emp2 <- matrix(nrow = 13, ncol = 13) emp[lower.tri(emp)] <- 2 emp2[lower.tri(emp2)] <- 3 # 创建新矩阵存储结果 result_mat <- matrix(nrow = 13, ncol = 13) # 填充下三角为2 result_mat[lower.tri(result_mat)] <- emp[lower.tri(emp)] # 填充上三角为3(转置emp2的下三角匹配上三角位置) result_mat[upper.tri(result_mat)] <- t(emp2[lower.tri(emp2)])
2. 封装函数处理列表中的矩阵
针对批量处理列表内矩阵的需求,封装带校验的函数:
merge_tri_matrices <- function(mat_list) { # 校验输入矩阵是否为同维度方阵 dims <- sapply(mat_list, dim) if (!all(dims[1,] == dims[2,]) || length(unique(dims[1,])) != 1) { stop("所有矩阵必须是同维度的方阵") } n <- dims[1,1] result <- matrix(nrow = n, ncol = n) # 下三角取列表第一个矩阵的下三角值 result[lower.tri(result)] <- mat_list[[1]][lower.tri(mat_list[[1]])] # 上三角取列表第二个矩阵的下三角转置值 result[upper.tri(result)] <- t(mat_list[[2]][lower.tri(mat_list[[2]])]) # 可自定义对角线值,示例设为NA diag(result) <- NA return(result) } # 函数调用示例 mat_list <- list(emp, emp2) final_mat <- merge_tri_matrices(mat_list)
注:如果需要调整对角线数值,直接修改
diag(result)的赋值即可。
内容的提问来源于stack exchange,提问作者Daniel Estévez
相关产品推荐
相关产品推荐

