householder方法化为Hessenberg矩阵(附Matlab、C代码)

1. Householder 变换1

Householder 变换也称为初等反射变换,下面先定义 Householder 矩阵。用 Householder 矩阵左乘一个向量(或矩阵),即实现 Householder 变换。设向量 w ∈ R n \mathbf{w}{\in}\mathbf{R}^n wRn 并且 w T w = 1 \mathbf{w^{T}}\mathbf{w}=1 wTw=1, 称矩阵 H ( w ) = I − 2 w w T \mathbf{H(w)}=\mathbf{I}-2\mathbf{w}\mathbf{w^\mathrm{T}} H(w)=I2wwT​ 为 Householder 矩阵
H ( w ) = [ 1 − 2 w 1 2 − 2 w 1 w 2 ⋯ − 2 w 1 w n − 2 w 2 w 1 1 − 2 w 2 2 ⋯ − 2 w 2 w n ⋮ ⋮ ⋱ ⋮ − 2 w n w 1 − 2 w n w 2 ⋯ 1 − 2 w n 2 ] , w = ( w 1 , w 2 , ⋅ ⋅ ⋅ , w n ) T \boldsymbol{H}(\boldsymbol{w})=\begin{bmatrix}1-2w_1^2&-2w_1w_2&\cdots&-2w_1w_n\\-2w_2w_1&1-2w_2^2&\cdots&-2w_2w_n\\\vdots&\vdots&\ddots&\vdots\\-2w_nw_1&-2w_nw_2&\cdots&1-2w_n^2\end{bmatrix},w =(w_1, w_2,\cdotp\cdotp\cdotp, w_n)^\mathrm{T} H(w)= 12w122w2w12wnw12w1w212w222wnw22w1wn2w2wn12wn2 ,w=(w1,w2,⋅⋅⋅,wn)T
定理:设 x = [ x 1 , x 2 , ⋯ , x n ] T ≠ 0 \mathbf{x} = {\left\lbrack x_{1},x_{2},{\cdots},x_{n} \right\rbrack}^{\mathrm{T}} {\neq} \mathbf{0} x=[x1,x2,,xn]T=0 , 则存在 Householder 矩阵 H \mathbf{H} H , 使 H x = − σ e 1 \mathbf{H}\mathbf{x} = {-} \sigma{\mathbf{e}}_{1} Hx=σe1 , 其中,

σ = sign ⁡ ( x 1 ) ∥ x ∥ 2 , e 1 = [ 1 , 0 , ⋯ , 0 ] T , sign ⁡ ( x 1 ) = { 1 , x 1 ≥ 0 − 1 , x 1 < 0 \sigma = \operatorname{sign}\left( x_{1} \right){\parallel}\mathbf{x}{{\parallel}}_{2},\quad{\mathbf{e}}_{1} = {\lbrack 1,0,{\cdots},0\rbrack}^{\mathrm{T}},\quad\operatorname{sign}\left( x_{1} \right) = \left\{\begin{array}{ll} 1, & x_{1} {\geq} 0 \\ {-} 1, & x_{1} < 0 \end{array} \right. σ=sign(x1)x2,e1=[1,0,,0]T,sign(x1)={1,1,x10x1<0

构造满足定理要求的 Householder 矩阵时,可取向量
w = ( x + σ e 1 ) / ∥ x + σ e 1 ∥ 2 w =(x+\sigma e_1)/\parallel x+\sigma e_1\parallel_2 w=(x+σe1)/x+σe12

H x   =   ( I − 2   v   v T v T   v ) x   =   x − 2   v T x v T v v Hx\:=\:\left(\boldsymbol{I}-2\:\frac{\boldsymbol{v}\:\boldsymbol{v}^\mathrm{T}}{\boldsymbol{v}^\mathrm{T}\:\boldsymbol{v}}\right)\boldsymbol{x}\:=\:\boldsymbol{x}-2\:\frac{\boldsymbol{v}^\mathrm{T}\boldsymbol{x}}{\boldsymbol{v}^\mathrm{T}\boldsymbol{v}}\boldsymbol{v} Hx=(I2vTvvvT)x=x2vTvvTxv

其中 v = ( x + σ e 1 ) \mathbf{v}=(x+\sigma e_1) v=(x+σe1)​,只需计算向量 v 与 x 的内积,而不需要计算矩阵与向量的乘法

2. 将矩阵化简为上 Hessenberg 矩阵 2

基本思路是: 先通过 Householder 变换将一般的矩阵 A \mathbf{A} A 正交相似变换为上 Hessenberg 矩阵, 然后用 QR 算法求上 Hessenberg 矩阵的特征值, 便得到原矩阵的特征值。上 Hessenberg 矩阵形如
[ × × × × × × × × × × × × × ] \begin{bmatrix} {\times} & {\times} & {\times} & {\times} \\ {\times} & {\times} & {\times} & {\times} \\ & {\times} & {\times} & {\times} \\ & & {\times} & {\times} \end{bmatrix} ×××××××××××××
下面考虑用初等反射阵来正交相似约化一般矩阵和对称矩阵. 设
A = ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ) ≡ ( a 11 A 12 ( 1 ) a 21 ( 1 ) A 22 ( 1 ) ) , \mathbf{A} = \begin{pmatrix} a_{11} & a_{12} & {\cdots} & a_{1n} \\ a_{21} & a_{22} & {\cdots} & a_{2n} \\ {\vdots} & {\vdots} & & {\vdots} \\ a_{n1} & a_{n2} & {\cdots} & a_{nn} \end{pmatrix} {\equiv} \begin{pmatrix} a_{11} & {\mathbf{A}}_{12}^{(1)} \\ {\mathbf{a}}_{21}^{(1)} & {\mathbf{A}}_{22}^{(1)} \end{pmatrix}, A= a11a21an1a12a22an2a1na2nann (a11a21(1)A12(1)A22(1)),
步 1 不妨设 a 21 ( 1 ) ≠ 0 {\mathbf{a}}_{21}^{(1)} {\neq} \mathbf{0} a21(1)=0 , 否则这一步不需约化, 选择初等反射阵 R 1 {\mathbf{R}}_{1} R1 使 R 1 a 21 ( 1 ) = {\mathbf{R}}_{1}{\mathbf{a}}_{21}^{(1)} = R1a21(1)= − σ 1 e 1 {-} {\sigma}_{1}e_{1} σ1e1 , 其中
{ σ 1 = sgn ⁡ ( a 21 ) ( ∑ i = 2 n a i 1 2 ) 1 2 , u 1 = a 21 ( 1 ) + σ 1 e 1 , ρ 1 = 1 2 ∥ u 1 ∥ 2 2 = σ 1 ( σ 1 + a 21 ) , R 1 = I − ρ 1 − 1 u 1 u 1 T . \left\{\begin{array}{l} {\sigma}_{1} = \operatorname{sgn}\left( a_{21} \right){\left( \mathop{{\sum}}\limits_{i = 2}^na_{i1}^{2} \right)}^{\frac{1}{2}}, \\ {\mathbf{u}}_{1} = {\mathbf{a}}_{21}^{(1)} + {\sigma}_{1}{\mathbf{e}}_{1}, \\ {\rho}_{1} = \frac{1}{2}{\left. \parallel{\mathbf{u}}_{1} \right.\parallel}_{2}^{2} = {\sigma}_{1}\left( {\sigma}_{1} + a_{21} \right), \\ {\mathbf{R}}_{1} = \mathbf{I} {-} {\rho}_{1}^{{-}1}{\mathbf{u}}_{1}{\mathbf{u}}_{1}^{\mathrm{T}}. \end{array} \right. σ1=sgn(a21)(i=2nai12)21,u1=a21(1)+σ1e1,ρ1=21u122=σ1(σ1+a21),R1=Iρ11u1u1T.
U 1 = ( I 0 0 R 1 ) {\mathbf{U}}_{1} = \begin{pmatrix} \mathbf{I} & \mathbf{0} \\ \mathbf{0} & R_{1} \end{pmatrix} U1=(I00R1) , 则
A 2 = U 1 A 1 U 1 = ( a 11 A 21 ( 1 ) R 1 R 1 a 21 ( 1 ) R 1 A 22 ( 1 ) R 1 ) ≡ ( A 11 ( 2 ) a 12 ( 2 ) A 13 ( 2 ) O a 22 ( 2 ) A 23 ( 2 ) ) , {\mathbf{A}}_{2} = {\mathbf{U}}_{1}{\mathbf{A}}_{1}{\mathbf{U}}_{1} = \begin{pmatrix} a_{11} & {\mathbf{A}}_{21}^{(1)}{\mathbf{R}}_{1} \\ {\mathbf{R}}_{1}{\mathbf{a}}_{21}^{(1)} & {\mathbf{R}}_{1}{\mathbf{A}}_{22}^{(1)}{\mathbf{R}}_{1} \end{pmatrix} {\equiv} \begin{pmatrix} {\mathbf{A}}_{11}^{(2)} & {\mathbf{a}}_{12}^{(2)} & {\mathbf{A}}_{13}^{(2)} \\ \mathbf{O} & {\mathbf{a}}_{22}^{(2)} & {\mathbf{A}}_{23}^{(2)} \end{pmatrix}, A2=U1A1U1=(a11R1a21(1)A21(1)R1R1A22(1)R1)(A11(2)Oa12(2)a22(2)A13(2)A23(2)),
其中
A 11 ( 2 ) ∈ R 2 × 1 , a 22 ( 2 ) ∈ R n − 2 , A 23 ( 2 ) ∈ R ( n − 2 ) × ( n − 2 ) . {\mathbf{A}}_{11}^{(2)} {\in} {\mathbf{R}}^{2 {\times} 1},\quad{\mathbf{a}}_{22}^{(2)} {\in} {\mathbf{R}}^{n {-} 2},\quad{\mathbf{A}}_{23}^{(2)} {\in} {\mathbf{R}}^{(n {-} 2) {\times} (n {-} 2)}. A11(2)R2×1,a22(2)Rn2,A23(2)R(n2)×(n2).
k \mathbf{k} k 设对 A \mathbf{A} A 已进行了第 k − 1 k {-} 1 k1 步正交相似约化, 即 A k {\mathbf{A}}_{k} Ak 有形式

A k = U k − 1 A k − 1 U k − 1 = [ a 11 a 12 ( 2 ) ⋯ a 1 k ( k ) a 1 , k + 1 ( k ) ⋯ a 1 n ( k ) − σ 1 a 22 ( 2 ) ⋯ a 2 k ( k ) a 2 , k + 1 ( k ) ⋯ a 2 n ( k ) ⋱ ⋱ ⋱ ⋮ ⋮ ⋮ ⋱ − σ k − 1 a k k ( k ) a k , k + 1 ( k ) ⋯ a k , n ( k ) ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ a k + 1 , k ( k ) a k + 1 , k + 1 ( k ) ⋯ a k + 1 , n ( k ) ⋮ ⋮ ⋮ a n k ( k ) a n , k + 1 ( k ) ⋯ a n n ( k ) ] {\mathbf{A}}_{k} = {\mathbf{U}}_{k {-} 1}{\mathbf{A}}_{k {-} 1}{\mathbf{U}}_{k {-} 1} = \begin{bmatrix} a_{11} & a_{12}^{(2)} & {\cdots} & a_{1k}^{(k)} & a_{1, k + 1}^{(k)} & {\cdots} & a_{1n}^{(k)} \\ {-} {\sigma}_{1} & a_{22}^{(2)} & {\cdots} & a_{2k}^{(k)} & a_{2, k + 1}^{(k)} & {\cdots} & a_{2n}^{(k)} \\ & {\ddots} & {\ddots} & {\ddots} & {\vdots} & {\vdots} & {\vdots} \\ & & {\ddots} & {-} {\sigma}_{k {-} 1} & a_{kk}^{(k)} & a_{k, k + 1}^{(k)} & {\cdots} & a_{k, n}^{(k)} \\ {\cdots} & {\cdots} & {\cdots} & {\cdots} & {\cdots} & {\cdots} & {\cdots} \\ & & & & a_{k + 1, k}^{(k)} & a_{k + 1, k + 1}^{(k)} & {\cdots} & a_{k + 1, n}^{(k)} \\ & & & & {\vdots} & {\vdots} & {\vdots} \\ & & & & & a_{nk}^{(k)} & a_{n, k + 1}^{(k)} & {\cdots} & a_{nn}^{(k)} \end{bmatrix} Ak=Uk1Ak1Uk1= a11σ1a12(2)a22(2)a1k(k)a2k(k)σk1a1,k+1(k)a2,k+1(k)akk(k)ak+1,k(k)ak,k+1(k)ak+1,k+1(k)ank(k)a1n(k)a2n(k)an,k+1(k)ak,n(k)ak+1,n(k)ann(k)

≡ ( A 11 ( k ) a 12 ( k ) A 13 ( k ) O a 22 ( k ) A 23 ( k ) ) , {\equiv} \begin{pmatrix} {\mathbf{A}}_{11}^{(k)} & {\mathbf{a}}_{12}^{(k)} & {\mathbf{A}}_{13}^{(k)} \\ \mathbf{O} & {\mathbf{a}}_{22}^{(k)} & {\mathbf{A}}_{23}^{(k)} \end{pmatrix}, (A11(k)Oa12(k)a22(k)A13(k)A23(k)),

其中
A 11 ( k ) ∈ R k × ( k − 1 ) , a 22 ( k ) ∈ R n − k , A 23 ( k ) ∈ R ( n − k ) × ( n − k ) . {\mathbf{A}}_{11}^{(k)} {\in} {\mathbf{R}}^{k {\times} (k {-} 1)},\quad{\mathbf{a}}_{22}^{(k)} {\in} {\mathbf{R}}^{n {-} k},\quad{\mathbf{A}}_{23}^{(k)} {\in} {\mathbf{R}}^{(n {-} k) {\times} (n {-} k)}. A11(k)Rk×(k1),a22(k)Rnk,A23(k)R(nk)×(nk).

a 22 ( k ) ≠ 0 {\mathbf{a}}_{22}^{(k)} {\neq} \mathbf{0} a22(k)=0 , 选择初等反射阵 R k {\mathbf{R}}_{k} Rk , 使 R k a 22 ( k ) = − σ k e 1 {\mathbf{R}}_{k}{\mathbf{a}}_{22}^{(k)} = {-} {\sigma}_{k}{\mathbf{e}}_{1} Rka22(k)=σke1 , 其中

{ σ k = sgn ⁡ ( a k + 1 , k ( k ) ) ( ∑ i = k + 1 n a i k 2 ) 1 2 , u k = a 22 ( k ) + σ k e 1 , ρ k = 1 2 ∥ u k ∥ 2 2 = σ k ( σ k + a k + 1 , n ( k ) ) , R k = I − ρ k − 1 u k u k T . \left\{\begin{array}{l} {\sigma}_{k} = \operatorname{sgn}\left( a_{k + 1, k}^{(k)} \right){\left( \mathop{{\sum}}\limits_{i = k + 1}^na_{ik}^{2} \right)}^{\frac{1}{2}}, \\ {\mathbf{u}}_{k} = {\mathbf{a}}_{22}^{(k)} + {\sigma}_{k}{\mathbf{e}}_{1}, \\ {\rho}_{k} = \frac{1}{2}{\left. \parallel{\mathbf{u}}_{k} \right.\parallel}_{2}^{2} = {\sigma}_{k}\left( {\sigma}_{k} + a_{k + 1, n}^{(k)} \right), \\ {\mathbf{R}}_{k} = \mathbf{I} {-} {\rho}_{k}^{{-}1}{\mathbf{u}}_{k}{\mathbf{u}}_{k}^{\mathrm{T}}. \end{array} \right. σk=sgn(ak+1,k(k))(i=k+1naik2)21,uk=a22(k)+σke1,ρk=21uk22=σk(σk+ak+1,n(k)),Rk=Iρk1ukukT.

U k = ( I O O R k ) {\mathbf{U}}_{k} = \begin{pmatrix} \mathbf{I} & \mathbf{O} \\ \mathbf{O} & {\mathbf{R}}_{k} \end{pmatrix} Uk=(IOORk) , 则

A k + 1 = U k A k U k = ( A 11 ( k ) a 12 ( k ) A 13 ( k ) R k O R k a 22 ( k ) R k A 23 ( k ) R k ) = ( A 11 ( k ) a 12 ( k ) A 13 ( k ) R k O − σ k e 1 R k A 23 ( k ) R k ) . {\mathbf{A}}_{k + 1} = {\mathbf{U}}_{k}{\mathbf{A}}_{k}{\mathbf{U}}_{k} = \begin{pmatrix} {\mathbf{A}}_{11}^{(k)} & {\mathbf{a}}_{12}^{(k)} & {\mathbf{A}}_{13}^{(k)}{\mathbf{R}}_{k} \\ \mathbf{O} & {\mathbf{R}}_{k}{\mathbf{a}}_{22}^{(k)} & {\mathbf{R}}_{k}{\mathbf{A}}_{23}^{(k)}{\mathbf{R}}_{k} \end{pmatrix} = \begin{pmatrix} {\mathbf{A}}_{11}^{(k)} & {\mathbf{a}}_{12}^{(k)} & {\mathbf{A}}_{13}^{(k)}{\mathbf{R}}_{k} \\ \mathbf{O} & {-} {\sigma}_{k}{\mathbf{e}}_{1} & {\mathbf{R}}_{k}{\mathbf{A}}_{23}^{(k)}{\mathbf{R}}_{k} \end{pmatrix}. Ak+1=UkAkUk=(A11(k)Oa12(k)Rka22(k)A13(k)RkRkA23(k)Rk)=(A11(k)Oa12(k)σke1A13(k)RkRkA23(k)Rk).

由上式知, A k + 1 {\mathbf{A}}_{k + 1} Ak+1 的左上角 k + 1 k + 1 k+1 阶子阵为上 Hessenberg 阵, 从而约化又进 了一步, 重复这过程, 直到

U n − 2 ⋯ U 2 U 1 A U 1 U 2 ⋯ U n − 2 = ( a 11 × × ⋯ × − σ 1 a 22 ( 2 ) × ⋯ × − σ 2 a 33 ( 3 ) ⋱ ⋮ ⋱ ⋱ × ⋱ × − σ n − 1 a n n ( n − 1 ) ) = A n − 1 . {\mathbf{U}}_{n {-} 2}{\cdots}{\mathbf{U}}_{2}{\mathbf{U}}_{1}\mathbf{A}{\mathbf{U}}_{1}{\mathbf{U}}_{2}{\cdots}{\mathbf{U}}_{n {-} 2} = \begin{pmatrix} a_{11} & {\times} & {\times} & {\cdots} & {\times} \\ {-} {\sigma}_{1} & a_{22}^{(2)} & {\times} & {\cdots} & {\times} \\ & {-} {\sigma}_{2} & a_{33}^{(3)} & {\ddots} & {\vdots} \\ & & {\ddots} & {\ddots} & {\times} \\ & & & {\ddots} & {\times} \\ & & & & {-} {\sigma}_{n {-} 1} & a_{nn}^{(n {-} 1)} \end{pmatrix} = {\mathbf{A}}_{n {-} 1}. Un2U2U1AU1U2Un2= a11σ1×a22(2)σ2××a33(3)××××σn1ann(n1) =An1.

定理:如果 A ∈ R n × n A {\in} {\mathbf{R}}^{n {\times} n} ARn×n 为对称阵,则存在初等反射阵 U 1 , U 2 , ⋯ , U n − 2 {\mathbf{U}}_{1},{\mathbf{U}}_{2},{\cdots},{\mathbf{U}}_{n {-} 2} U1,U2,,Un2 ,使

U n − 2 ⋯ U 2 U 1 A U 1 U 2 ⋯ U n − 2 = A n − 1 = ( c 1 b 1 b 1 c 2 b 2 ⋱ ⋱ ⋱ b n − 2 c n − 1 b n − 1 b n − 1 c n ) ≡ C . {\mathbf{U}}_{n {-} 2}{\cdots}{\mathbf{U}}_{2}{\mathbf{U}}_{1}\mathbf{A}{\mathbf{U}}_{1}{\mathbf{U}}_{2}{\cdots}{\mathbf{U}}_{n {-} 2} = {\mathbf{A}}_{n {-} 1} = \begin{pmatrix} c_{1} & b_{1} & & & \\ b_{1} & c_{2} & b_{2} & & \\ & {\ddots} & {\ddots} & {\ddots} & \\ & & b_{n {-} 2} & c_{n {-} 1} & b_{n {-} 1} \\ & & & b_{n {-} 1} & c_{n} \end{pmatrix} {\equiv} \mathbf{C}. Un2U2U1AU1U2Un2=An1= c1b1b1c2b2bn2cn1bn1bn1cn C.

由上面讨论可知,在由 A k → A k + 1 = U k A k U k {\mathbf{A}}_{k} {\rightarrow} {\mathbf{A}}_{k + 1} = {\mathbf{U}}_{k}{\mathbf{A}}_{k}{\mathbf{U}}_{k} AkAk+1=UkAkUk 一步计算过程中,只需计算 R k {\mathbf{R}}_{k} Rk R k A 22 ( k ) R k {\mathbf{R}}_{k}{\mathbf{A}}_{22}^{(k)}{\mathbf{R}}_{k} RkA22(k)Rk . 由于 A \mathbf{A} A 的对称性,故只需计算 R k A 23 ( k ) R k {\mathbf{R}}_{k}{\mathbf{A}}_{23}^{(k)}{\mathbf{R}}_{k} RkA23(k)Rk 的对角线下面的元素. 注意到

R k A 23 ( k ) R k = ( I − ρ k − 1 u k u k T ) ( A 23 ( k ) − ρ k − 1 A 23 ( k ) u k u k T ) , {\mathbf{R}}_{k}{\mathbf{A}}_{23}^{(k)}{\mathbf{R}}_{k} = \left( \mathbf{I} {-} {\rho}_{k}^{{-}1}{\mathbf{u}}_{k}{\mathbf{u}}_{k}^{\mathrm{T}} \right)\left( {\mathbf{A}}_{23}^{(k)} {-} {\rho}_{k}^{{-}1}{\mathbf{A}}_{23}^{(k)}{\mathbf{u}}_{k}{\mathbf{u}}_{k}^{\mathrm{T}} \right), RkA23(k)Rk=(Iρk1ukukT)(A23(k)ρk1A23(k)ukukT),
引进记号
r k = ρ k − 1 A 23 ( k ) u k , t k = r k − ρ k − 1 2 ( u k T r k ) u k , {\mathbf{r}}_{k} = {\rho}_{k}^{{-}1}{\mathbf{A}}_{23}^{(k)}{\mathbf{u}}_{k},\quad{\mathbf{t}}_{k} = {\mathbf{r}}_{k} {-} \frac{{\rho}_{k}^{{-}1}}{2}\left( {\mathbf{u}}_{k}^{\mathrm{T}}{\mathbf{r}}_{k} \right){\mathbf{u}}_{k}, rk=ρk1A23(k)uk,tk=rk2ρk1(ukTrk)uk,

R k A 23 ( k ) R k = A 23 ( k ) − u k t k T − t k u k T ( i = k + 1 , ⋯ , n ; j = k + 1 , ⋯ , i ) . \quad{\mathbf{R}}_{k}{\mathbf{A}}_{23}^{(k)}{\mathbf{R}}_{k} = {\mathbf{A}}_{23}^{(k)} {-} {\mathbf{u}}_{k}{\mathbf{t}}_{k}^{\mathrm{T}} {-} {\mathbf{t}}_{k}{\mathbf{u}}_{k}^{\mathrm{T}}\quad(i = k + 1,{\cdots},n;j = k + 1,{\cdots},i). RkA23(k)Rk=A23(k)uktkTtkukT(i=k+1,,n;j=k+1,,i).

一般矩阵的变换Matlab代码3如下

function [H,P]=hessenb(A)
%使用Householder变换将矩阵A变为Hessenberg矩阵
%[H,P] H为变换后的Hessenberg矩阵,P为变换矩阵
[n,n]=size(A);
E=eye(n);
P1=E;
for k=1:n-2
    s=-sign(A(k+1,k))*norm(A(k+1:n,k));
    W(1:k)=zeros(1,k);
    W(k+1)=(A(k+1,k)+s);
    W(k+2:n)=A(k+2:n,k)';
    if norm(W)~=0
        W=W/norm(W);
    end
    P=E-2*W'*W;
    A=P*A*P;
    P1=P1*P;
end
H=A;
P=P1;

针对实对称矩阵的Matlab代码如下

function [Q,A]=rsmhessenb(A)
%实对称矩阵化为三对角矩阵
n=length(A(:,1));
Q=eye(n);
for i=2:n
    sigma=sign(A(i,i-1))*sqrt(sum(A(i:n,i-1).^2));
    rou=sigma*(A(i,i-1)+sigma);
    A(i,i-1)=A(i,i-1)+sigma;
    R=eye(n-i+1)-1.0/rou*A(i:n,i-1)*A(i:n,i-1)';
    A(i,i-1)=-sigma;
    A(i+1:n,i-1)=0;
    A(i-1,i:n)=A(i:n,i-1);%A^T=A
    A(i:n,i:n)=R*A(i:n,i:n)*R;
    m=length(R(:,1));
    U=[eye(n-m,n-m),zeros(n-m,m);zeros(m,n-m),R];
    Q=Q*U;
end

将三对角化的数学过程转为C语言代码实现

void rsmhessenb(double A[], int n, double Q[],double u[],double t[]) {
    //输入实对称矩阵A->三对角矩阵,输出变换矩阵Q,主对角线u,次对角线t
    int i, j, k;
    double sigma, rou,d;//记录求和值    
    // 初始化Q为单位矩阵
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            Q[i * n + j] = (i == j) ? 1.0 : 0.0;
        }
    }
    for (i = 1; i < n; i++){
        //初始化向量t、u
        for(j=0;j<n;j++){
            t[j]=0.0;
            u[j]=0.0;
        }
        d=0.0;//记录矩阵内积值,每次循环清零
        // 计算sigma
        sigma = 0.0;
        for (j = i; j < n; j++) {
            sigma += A[j * n + i-1] * A[j * n + i-1];
        }
        sigma =(A[i*n+i-1] >= 0) ? sqrt(sigma): -sqrt(sigma);
        // 计算ρ
        rou = sigma * (A[i * n + i - 1] + sigma);
        //构建向量u
        u[i]=sigma+A[i * n + i - 1];
        for(j=i+1;j<n;j++){
            u[j] = A[j*n+i-1];
        }
        //t=A*u/ρ,作为中间过程的r
        for(j=i;j<n;j++){
            for(k=i;k<n;k++){
               t[j]+=A[j*n+k]*u[k]/rou;
        }
        }
        //d=(u^T)*t/(2ρ)
        for(j=i;j<n;j++){
            d+=u[j]*t[j]/2/rou;
        }
        //计算真实的t
        for(j=i;j<n;j++){
            t[j]=t[j]-u[j]*d;
        }
        //计算R*A*R=A-u*(t^T)-t*(u^T),更新下方矩阵
        for(j=i;j<n;j++){
            for(k=j;k<n;k++){
                A[j*n+k]=A[j*n+k]-u[j]*t[k]-u[k]*t[j];
                if(k!=j){
                    A[k*n+j]=A[j*n+k];//更新对角元素 
                }
                }
            if(j+1<n){
                A[(j+1)*n+i-1]=0.0;//更新0元素
                A[(i-1)*n+j+1]=0.0;
            }
        }
        A[i*n+i-1]=-sigma;//更新次对角线
        A[(i-1)*n+i]=-sigma;
        sigma=0.0;//清零用于变换矩阵的计算
        for(j=0;j<n;j++){
            sigma+=u[j]*u[j];
        }
        //清零用于存储Q*u
        for(j=0;j<n;j++){
            t[j]=0.0;
        }
        //计算Q*u
        for(j=0;j<n;j++){
            for(k=0;k<n;k++){
                t[j]+=Q[j*n+k]*u[k];
            }
        }
        //计算Q*变换矩阵=Q-2*u*(u^T)/sigma        
        for(j=0;j<n;j++){
            for(k=0;k<n;k++){
                Q[j*n+k]=Q[j*n+k]-t[j]*u[k]*2/sigma;
            }
        }
    }
    //返回对角元素
    for (i = 0; i < n; i++) {
        u[i]=A[i*n+i];
        if((i+1)<n){
            t[i]=A[(i+1)*n+i];
        }
    }
}

3. 结果验证

​ 一般矩阵的Hessenberg化验证

在这里插入图片描述

图1. 一般矩阵变换结果

​ 实对称矩阵的hessenberg化验证

在这里插入图片描述

图2. 实对称测试矩阵

在这里插入图片描述

图3. 实对称矩阵变换结果

​ C语言实对称hessenberg化验证,测试矩阵与Matlab保持一致

在这里插入图片描述

图4. C代码运行结果

​ 由上图可知,C代码输出结果与Matlab结果相同。

4. 参考文献


  1. 喻文健主编. 数值分析与算法 第3版[M]. 北京:清华大学出版社, 2020.03 ↩︎

  2. 李庆扬,王能超,易大义. 数值分析 第5版[M]. 武汉:华中科技大学出版社, 2018.04. ↩︎

  3. 夏省祥,于正文著. 常用数值算法及其MATLAB实现[M]. 北京:清华大学出版社, 2014.04. ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值