6.10 谱分解
文章目录
- 计算方法
- 代码实现
计算方法
单纯矩阵normal matrix指的是符号ATA=AATA^TA=AA^TATA=AAT的矩阵,他们的特征值互异。此外,单纯矩阵还有个特点,他们的特征空间彼此正交。
对于单纯矩阵,存在以下的谱定理Spectral theorem:
单纯矩阵可以分解为以下矩阵相加的形式:
A=∑i=1nλiviviHA=\sum_{i=1}^n\lambda_iv_iv_i^H A=i=1∑nλiviviH
公式中,viv_ivi是特征值λi\lambda_iλi对应的单位特征向量。
把矩阵分解为这种形式就是谱分解Spectral Decompostion。所以谱分解挺容易的,求出特征值和特征向量就行了。
以下是一个矩阵谱分解的例子:
(3000020000−20000−1)=3(1000000000000000)+2(0000010000000000)−2(0000000000100000)−(0000000000000001)\begin{pmatrix}3 & 0 & 0 & 0\\ 0 & 2 & 0 & 0\\ 0 & 0 & -2 & 0\\ 0 & 0 & 0 & -1\\ \end{pmatrix}\\ = 3 \begin{pmatrix}1 & 0 & 0 & 0\\ 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0\\ \end{pmatrix}+2 \begin{pmatrix}0 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0\\ \end{pmatrix} -2 \begin{pmatrix}0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 0\\ \end{pmatrix} -\begin{pmatrix}0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 1\\ \end{pmatrix} 3000020000−20000−1=31000000000000000+20000010000000000−20000000000100000−0000000000000001
代码实现
特征值可以用海森堡法求解,特征向量可以用齐次方程组求解的方法求得,最后注意单位化就行了。以下是python代码:
# 谱分解def spectral_decomposition(self):# 求特征值from com.youngthing.mathalgorithm.linearalgebra.hessenberg import Matrix as Meigen_values = M(self.__vectors).eigen_values()spectral_matrices = []for i, e in enumerate(eigen_values):# 单纯矩阵的几何重数为1eigen_vector = self.eigen_vector(e)[0]vector_len = Matrix.vector_len(eigen_vector)eigen_vector = matrix_utils.mul_num(eigen_vector, 1 / vector_len)x = Matrix([eigen_vector])spectral_matrices.append(x * x.transpose_matrix())return eigen_values, spectral_matrices