Python构造对称矩阵时对角线值错误,求问题原因排查
问题分析与解决方案
嘿,我来帮你定位问题并解决它!
问题根源
你的代码逻辑里有个关键错误:你把转置后的Mat2的对角线元素设为0,再和原矩阵Mat1相加。这样一来,Mat1原本的对角线元素(1、4、6)会和Mat2的0相加,结果自然变成0,这就丢失了你想要保留的对角线值。
我们来拆解一下你的代码执行过程:
Mat2 = np.transpose(Mat1)后,Mat2的对角线和Mat1完全一致,都是[1,4,6]- 你通过循环把
Mat2的对角线全部设为0,此时Mat2的对角线是[0,0,0] Mat = Mat2 + Mat1时,对角线的计算就是Mat1[i,i] + 0,最终得到0
正确的对称矩阵构造方法
下面提供两种简单的方式,既能得到对称矩阵,又能保留原矩阵的对角线:
方法1:利用矩阵运算直接构造
通过原矩阵加转置矩阵,再减去重复的对角线(因为原矩阵和转置矩阵的对角线相加后是原来的2倍,我们只需要保留1倍):
import numpy as np Mat1 = np.array([[1, 2, 3], [0, 4, 5], [0, 0, 6]]) # 原矩阵 + 转置矩阵 - 对角线重复部分 Mat = Mat1 + Mat1.T - np.diag(np.diag(Mat1)) print(Mat)
运行结果:
[[1 2 3] [2 4 5] [3 5 6]]
方法2:循环填充对称元素(更直观)
复制原矩阵后,只填充上三角/下三角的对称元素,不修改对角线:
import numpy as np Mat1 = np.array([[1, 2, 3], [0, 4, 5], [0, 0, 6]]) Mat = Mat1.copy() # 遍历上三角的元素,给对应的下三角位置赋值 for i in range(3): for j in range(i+1, 3): Mat[j, i] = Mat1[i, j] print(Mat)
运行结果和上面完全一致。
总结
你只需要避免把转置矩阵的对角线清零,或者调整相加逻辑保留原对角线元素,就能得到符合预期的对称矩阵啦!
内容的提问来源于stack exchange,提问作者MRT
相关产品推荐
相关产品推荐

