householder方法化为Hessenberg矩阵
1. Householder 变换1
Householder 变换也称为初等反射变换,下面先定义 Householder 矩阵。用 Householder 矩阵左乘一个向量(或矩阵),即实现 Householder 变换。设向量
w
∈
R
n
\mathbf{w}{\in}\mathbf{R}^n
w∈Rn 并且
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)=I−2wwT 为 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)=
1−2w12−2w2w1⋮−2wnw1−2w1w21−2w22⋮−2wnw2⋯⋯⋱⋯−2w1wn−2w2wn⋮1−2wn2
,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)∥x∥2,e1=[1,0,⋯,0]T,sign(x1)={1,−1,x1≥0x1<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+σe1∥2
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=(I−2vTvvvT)x=x−2vTvvTxv
其中 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=
a11a21⋮an1a12a22⋮an2⋯⋯⋯a1na2n⋮ann
≡(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=2∑nai12)21,u1=a21(1)+σ1e1,ρ1=21∥u1∥22=σ1(σ1+a21),R1=I−ρ1−1u1u1T.
令
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)∈Rn−2,A23(2)∈R(n−2)×(n−2).
步
k
\mathbf{k}
k 设对
A
\mathbf{A}
A 已进行了第
k
−
1
k {-} 1
k−1 步正交相似约化, 即
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=Uk−1Ak−1Uk−1= a11−σ1⋯a12(2)a22(2)⋱⋯⋯⋯⋱⋱⋯a1k(k)a2k(k)⋱−σk−1⋯a1,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×(k−1),a22(k)∈Rn−k,A23(k)∈R(n−k)×(n−k).
设 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+1∑naik2)21,uk=a22(k)+σke1,ρk=21∥uk∥22=σk(σk+ak+1,n(k)),Rk=I−ρk−1ukukT.
设 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}. Un−2⋯U2U1AU1U2⋯Un−2= a11−σ1×a22(2)−σ2××a33(3)⋱⋯⋯⋱⋱⋱××⋮××−σn−1ann(n−1) =An−1.
定理:如果 A ∈ R n × n A {\in} {\mathbf{R}}^{n {\times} n} A∈Rn×n 为对称阵,则存在初等反射阵 U 1 , U 2 , ⋯ , U n − 2 {\mathbf{U}}_{1},{\mathbf{U}}_{2},{\cdots},{\mathbf{U}}_{n {-} 2} U1,U2,⋯,Un−2 ,使
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}. Un−2⋯U2U1AU1U2⋯Un−2=An−1= c1b1b1c2⋱b2⋱bn−2⋱cn−1bn−1bn−1cn ≡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} Ak→Ak+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−ρk−1ukukT)(A23(k)−ρk−1A23(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=ρk−1A23(k)uk,tk=rk−2ρk−1(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)−uktkT−tkukT(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化验证
实对称矩阵的hessenberg化验证
C语言实对称hessenberg化验证,测试矩阵与Matlab保持一致
由上图可知,C代码输出结果与Matlab结果相同。