如何从相似度向量还原为对称相似度矩阵?(R语言场景)
从dist转换的数值向量还原对称相似度矩阵(R语言通用实现)
问题背景
通过dist()生成带对称结构的距离/相似度矩阵后,用as.numeric()将其转换为一维向量,现在需要将该向量反向还原为原对称矩阵。以下是通用实现方法,结合示例说明:
示例场景
已知转换后的向量为:
vec <- c(2.828427, 5.656854, 2.828427)
目标还原为3×3的对称矩阵(对角线为0):
[,1] [,2] [,3] [1,] 0.000000 2.828427 5.656854 [2,] 2.828427 0.000000 2.828427 [3,] 5.656854 2.828427 0.000000
通用实现步骤与代码
计算矩阵维度n:
对称矩阵的上三角(不含对角线)元素总数为n(n-1)/2,通过解方程可推导n:n <- ceiling((sqrt(8 * length(vec) + 1) - 1) / 2)示例中
length(vec)=3,代入得n=3。初始化零矩阵:
sim_mat <- matrix(0, nrow = n, ncol = n)填充上三角区域:
利用upper.tri()获取上三角(不含对角线)的位置,将向量元素填入:sim_mat[upper.tri(sim_mat)] <- vec利用对称性填充下三角:
转置矩阵后复制下三角区域的元素:sim_mat[lower.tri(sim_mat)] <- t(sim_mat)[lower.tri(sim_mat)]查看结果:
print(sim_mat)
适配含对角线的向量场景
如果原始dist()设置了diag=T,转换后的向量包含对角线的0元素,只需调整三角位置的参数为upper.tri(sim_mat, diag=T),上述n的计算公式依然适用(此时元素总数为n(n+1)/2):
# 含对角线的示例向量 vec_with_diag <- c(0, 2.828427, 5.656854, 0, 2.828427, 0) n <- ceiling((sqrt(8 * length(vec_with_diag) + 1) - 1) / 2) sim_mat <- matrix(0, nrow = n, ncol = n) sim_mat[upper.tri(sim_mat, diag = TRUE)] <- vec_with_diag sim_mat[lower.tri(sim_mat)] <- t(sim_mat)[lower.tri(sim_mat)]
内容的提问来源于stack exchange,提问作者ben
相关产品推荐
相关产品推荐

