求复数域内给定矩阵的特征值特征向量及SVD算法所需计算代码
复数域内矩阵的特征值与特征向量计算方法
- 特征值计算:求解特征方程
det(A - λI) = 0,方程的所有根(含重根)即为复数域内的全部特征值。 - 特征向量计算:对每个特征值λ,求解线性方程组
(A - λI)x = 0,方程组的非零解空间对应λ的特征子空间,子空间内所有非零向量都是该特征值对应的特征向量。
对称矩阵特征值与特征向量的Python实现(适配SVD需求)
针对对称矩阵,QR迭代法是稳定且高效的特征值/特征向量计算方案,以下是可直接复用的实现代码:
import numpy as np def symmetric_eigen(A): # 校验输入是否为对称矩阵 if not np.allclose(A, A.T): raise ValueError("输入矩阵必须是对称矩阵") n = A.shape[0] # 累积正交变换矩阵,最终列向量为特征向量 Q_accum = np.eye(n) current_A = np.copy(A) # QR迭代收敛到对角矩阵 for _ in range(1000): Q, R = np.linalg.qr(current_A) current_A = R @ Q Q_accum = Q_accum @ Q # 判断收敛:非对角元素足够小 off_diag_max = np.abs(current_A - np.diag(np.diag(current_A))).max() if off_diag_max < 1e-10: break # 提取特征值与特征向量,并按特征值降序排列 eigenvalues = np.diag(current_A) eigenvectors = Q_accum sort_idx = eigenvalues.argsort()[::-1] return eigenvalues[sort_idx], eigenvectors[:, sort_idx] # 测试示例 if __name__ == "__main__": # 构造对称测试矩阵 test_A = np.array([[4, 1, 1], [1, 3, 0], [1, 0, 2]]) vals, vecs = symmetric_eigen(test_A) print("特征值:", vals) print("特征向量:\n", vecs) # 验证结果正确性 print("\n验证通过:", np.allclose(test_A @ vecs, vecs @ np.diag(vals)))
代码说明
- 利用对称矩阵QR迭代的收敛特性:迭代后矩阵会收敛为对角矩阵,对角元素即为特征值,累积的正交矩阵列向量对应特征向量。
- 加入输入校验,避免非对称矩阵导致的计算错误。
- 通过非对角元素的最大值判断收敛,平衡计算精度与效率。
- 最终对特征值/特征向量降序排列,适配SVD分解中奇异值从大到小的常规输出要求。
SVD中对称矩阵特征值的应用逻辑
在实矩阵的SVD分解 A = UΣV^T 中,可通过对称矩阵的特征值计算推导核心分量:
- 计算对称矩阵
A^T A的特征值,其平方根即为Σ的对角元素(奇异值)。 A^T A的特征向量构成V矩阵。- U矩阵可通过
U = A V Σ^{-1}计算(A满秩时有效)。
内容的提问来源于stack exchange,提问作者Danilo Giovannico
相关产品推荐
相关产品推荐

