如何将非对称值的对称维度矩阵重构为下三角矩阵?
将非对称数值的对称列名矩阵转换为下三角矩阵
需要把列名对称但数值非对称的矩阵转换为下三角矩阵,常规清除上半部分数值的方法不适用,必须通过调整行列顺序实现。示例矩阵如下:
mat_before <- structure(c(0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0), .Dim = c(8L, 8L), .Dimnames = list(c("Features", "Innovation", "KPI", "Knowledge", "Performance", "Presence", "Trust", "VFM"), c("Features", "Innovation", "KPI", "Knowledge", "Performance", "Presence", "Trust", "VFM")))
运行后输出:
Features Innovation KPI Knowledge Performance Presence Trust VFM Features 0 0 0 1 1 0 0 0 Innovation 0 0 0 0 0 1 0 0 KPI 0 1 0 0 1 0 1 1 Knowledge 0 0 0 0 0 1 0 0 Performance 0 0 0 1 0 1 0 0 Presence 0 0 0 0 0 0 0 0 Trust 1 0 0 0 0 0 0 0 VFM 0 1 0 0 0 0 0 0
期望得到的下三角矩阵结果:
> matrix_result Presence Knowledge Performance Innovation Features Trust VFM KPI Presence 0 0 0 0 0 0 0 0 Knowledge 1 0 0 0 0 0 0 0 Performance 1 1 0 0 0 0 0 0 Innovation 1 0 0 0 0 0 0 0 Features 0 1 1 0 0 0 0 0 Trust 0 0 0 0 1 0 0 0 VFM 0 0 0 1 0 0 0 0 KPI 0 0 1 1 0 1 1 0
要求实现思路或代码,且代码需可复用至任意对称维度、不同大小和列名的矩阵。
解决方案
实现思路
核心是找到行列的重排顺序,让重排后的矩阵仅下三角区域保留非0值。具体逻辑:
- 将矩阵视作有向图:若
mat[row, col] = 1,则表示从row节点到col节点有一条有向边 - 对图执行拓扑排序,得到一个节点顺序,确保所有有向边都从排序后的后方节点指向前方节点
- 按照拓扑排序结果重排原矩阵的行和列,再对应填充非0值,即可得到下三角矩阵
可复用代码
library(igraph) convert_to_lowertri <- function(mat) { # 将矩阵转换为有向图对象 g <- graph_from_adjacency_matrix(mat, mode = "directed", weighted = NULL) # 执行拓扑排序,反转顺序确保边从后向前指向 topo_order <- rev(topological.sort(g)) # 按拓扑排序结果重排行和列 mat_reordered <- mat[topo_order, topo_order] # 清空上三角(含主对角线)的初始值 mat_reordered[upper.tri(mat_reordered, diag = TRUE)] <- 0 # 填充下三角区域的对应值 for (i in seq_len(nrow(mat_reordered))) { for (j in seq_len(i-1)) { row_name <- rownames(mat_reordered)[i] col_name <- colnames(mat_reordered)[j] mat_reordered[i, j] <- mat[row_name, col_name] } } return(mat_reordered) } # 测试示例矩阵 matrix_result <- convert_to_lowertri(mat_before) print(matrix_result)
该函数支持任意对称维度、不同大小和列名的矩阵(若矩阵对应的图存在环,拓扑排序会报错,可根据实际场景添加环处理逻辑)。
内容的提问来源于stack exchange,提问作者Shaun
相关产品推荐
相关产品推荐

