You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将非对称值的对称维度矩阵重构为下三角矩阵?

将非对称数值的对称列名矩阵转换为下三角矩阵

需要把列名对称但数值非对称的矩阵转换为下三角矩阵,常规清除上半部分数值的方法不适用,必须通过调整行列顺序实现。示例矩阵如下:

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值。具体逻辑:

  1. 将矩阵视作有向图:若mat[row, col] = 1,则表示从row节点到col节点有一条有向边
  2. 对图执行拓扑排序,得到一个节点顺序,确保所有有向边都从排序后的后方节点指向前方节点
  3. 按照拓扑排序结果重排原矩阵的行和列,再对应填充非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:31:01