MATLAB編程與應用系列-第3章 矩陣運算(4)

本系列教程來源於出版設計《基於MATLAB編程基礎與典型應用書籍》,如涉及版權問題,請聯繫:[email protected]。 出版社:人民郵電出版社, 頁數:525。

本系列教程目前基於MATLABR2006a,可能對於更高級版本的功能和函數有差異,教程中如有問題,請聯繫:[email protected]

##3.2 矩陣的分解
矩陣的分解是矩陣相關運算中的重要內容,MATLAB提供了用於矩陣分解運算的多種函數。本節將集中介紹MATLAB所提供的矩陣分解運算函數的功能及使用。

###3.2.1 LU分解
矩陣的三角分解又稱高斯消去法分解,它的目的是將一個矩陣分解成一個下三角矩陣L和一個上三角矩陣U的乘積,即A=LU。MATLAB提供了專門的函數lu來計算矩陣的LU分解。該函數的調用格式如下:

① [L,U] = lu(X)
② [L,U,P] = lu(X)

其中,返回矩陣U爲上三角陣,矩陣L爲下三角陣或其變換形式,且滿足LU=X。返回矩陣P爲單位矩陣的行變換矩陣,滿足LU=PX。

【例3.24】矩陣X的LU分解
在命令窗口中輸入以下內容,創建矩陣X:
>> X=[5 3 4 8 5;6 8 7 6 9;2 6 8 2 1;2 7 9 3 9;4 5 6 7 8];
①對矩陣X進行LU分解,在命令窗口輸入:
>> [L,U] = lu(X) %對矩陣X進行LU分解

###3.2.2 奇異值分解
奇異值分解在矩陣分析中佔有極其重要的作用。MATLAB提供了用於矩陣奇異值分解的函數svd,該函數是利用LINPACK程序庫中的ZSVDC編制而成的。在計算的過程中假如經過75步QR分解仍得不到一個奇異值,那麼系統會給出“不收斂”的提示。奇異值分解函數svd的幾種調用格式如下:

① s = svd (X)
② [U,S,V] = svd (X)
③ [U,S,V] = svd (X,0)

其中,命令①返回向量s包含矩陣X分解所得到的全部奇異值向量。命令② 返回一個與X同大小的對角矩陣S和兩個酉矩陣U與V,且滿足= USV'。命令③ 得到一個“有效大小”的分解,如果m×n維矩陣X中m>n則只計算出矩陣U的前n列,矩陣S的大小爲n×n。

【例3.25】奇異值分解。
在命令窗口中輸入以下內容,創建矩陣b1。
>> b1=[1 2 3;4 5 6;7 8 9;2 4 6;5 7 5];
①對b1進行奇異值分解,返回一個與b1同大小的對角矩陣S以及兩個酉矩陣U和V。在命令窗口中輸入:
>> [U,S,V] = svd (b1) %對b1進行奇異值分解
②對b1進行奇異值分解,調用能得到一個“有效大小”的分解的函數格式,返回對角矩陣S以及兩個酉矩陣U和V。在命令窗口中輸入:
>> [U,S,V] = svd (b1,0) %對b1進行奇異值分解

###3.2.3 特徵值分解
MATLAB提供了eig函數來對矩陣進行特徵值分解,該函數的幾種調用格式如下:

① d = eig(A)
② d = eig(A,B)
③ [V,D] = eig(A)
④ [V,D] = eig(A,'nobalance')
⑤ [V,D] = eig(A,B)
⑥ [V,D] = eig(A,B,flag)

其中,①計算矩陣A的特徵值d,返回結果以向量形式存放。②計算方陣A和B的廣義特徵值d,返回結果以向量形式存放。③計算矩陣A的特徵值對角陣D和特徵向量陣V,使AV=VD成立。④計算矩陣A的特徵值對角陣D和特徵向量陣V,使AV=VD成立。當矩陣A中有與截斷誤差數量級相差不遠的值時,該指令可能更精確。'nobalance'起誤差調節作用。⑤計算矩陣A和B的廣義特徵值向量陣V和廣義特徵值陣D,滿足AV=BVD。最後一條命令⑥由flag指定算法計算矩陣A和B的特徵值D和特徵向量V。其中,flag的可能值爲:'chol' 和'qz' 。當flag值爲'chol'時表示對B使用Cholesky分解算法,其中A爲對稱Hermitian矩陣,B爲正定陣。當flag值爲'qz'時表示使用QZ算法,其中A、B爲非對稱或非Hermitian矩陣。

【3.26】特徵值分解
在命令窗口中輸入以下內容,創建矩陣A。
>> A=[1 2 3 4 5;5 3 4 8 5;6 8 7 6 9;2 6 8 2 1;2 7 9 3 9];
對矩陣A進行特徵值分解,在命令窗口輸入:
>> [V,D] = eig(A) %對矩陣A進行特徵值分解

###3.2.4 Cholesky分解
MATLAB提供了chol函數來對矩陣進行Cholesky分解,該函數的調用格式爲:

①R = chol(X)
②[R,p] = chol(X)

函數調用格式①如果X爲n階對稱正定矩陣,則存在一個實的非奇異上三角陣R,滿足R'*R = X;若X非正定,則產生錯誤信息。②不產生任何錯誤信息,若X爲正定陣,則p=0,R與上相同;若X非正定,則p爲正整數,R是有序的上三角陣。

【例3.27】Cholesky分解
在命令窗口中輸入以下內容,創建矩陣A。
>> A=[1 2 3 4 5;5 3 4 8 5;6 8 7 6 9;2 6 8 2 1;2 7 9 3 9];
對矩陣A進行Cholesky分解,在命令窗口中輸入:
>> [R,p] = chol(A) %對矩陣A進行Cholesky分解

###3.2.5 QR分解
正交矩陣是指矩陣的列向量相互正交,且各個列向量的長度相等。QR分解就是將矩陣A分解成一個正交矩陣與一個上三角矩陣的乘積。MATLAB提供了用於矩陣QR分解的函數,表3.7中介紹用於矩陣QR分解的函數調用格式和功能。
表3.7 矩陣QR分解
函數名 功能
[Q,R] = qr(A) 求得正交矩陣Q和上三角陣R,Q和R滿足A=QR
[Q,R,E] = qr(A) 求得正交矩陣Q、上三角陣R和單位矩陣的變換形式矩陣E,R的對角線元素按大小降序排列,滿足AE=QR
[Q,R] = qr(A,0) 產生矩陣A的“經濟大小”分解
[Q,R,E] = qr(A,0) E的作用是使得R的對角線元素降序,且Q*R=A(:, E)
R = qr(A) 稀疏矩陣A的分解,只產生一個上三角陣R,滿足R'R = A'A,這種方法計算A'*A時減少了內在數字信息的損耗
[C,R] = qr(A,b) 用於稀疏最小二乘問題:minimize 的兩步解:[C,R] = qr(A,b),x = R\c
R = qr(A,0) 針對稀疏矩陣A的經濟型分解
[C,R] = qr(A,b,0) 針對稀疏最小二乘問題的經濟型分解
[Q,R]= qrdelete(Q,R,j) 返回將矩陣A的第j列移去後的新矩陣的qr分解
[Q,R]= qrinsert(Q,R,j,x) 在矩陣A中第j列插入向量x後的新矩陣進行qr分解。若j大於A的列數,表示在A的最後插入列x

###3.2.6 Schur分解
Schur分解將使用schur函數,該函數的調用格式爲:

①T = schur(A)
②T = schur(A,flag)
③[U,T] = schur(A,…)

命令行①-③返回正交矩陣U和schur矩陣T,滿足A = UTU'。其中,若A有復特徵根,則flag='complex',否則flag='real'。

【例3.31】Schur分解
在命令窗口輸入以下內容,創建矩陣K。
>> K=magic(3); %生成3階的魔方陣
對矩陣K進行Schur分解,在命令窗口輸入:
>> [U,T]=schur(K) %對矩陣K進行Schur分解

###3.2.7 複數特徵值對角陣與實數塊特徵值對角陣的轉換
即使是實陣,在其特徵值中也可能出現複數。實際使用中常需要把這一對對共軛複數特徵值轉化爲一個(2x2)的實數塊。函數調用格式爲:

① [VC,DC] = rsf2csf (VR,DR) % 將實舒爾形式轉化成復舒爾形式
② [VR,DR] = cdf2rdf (VC,DC) %將復舒爾形式轉化成實舒爾形式

【例3.32】複數特徵值對角陣與實數塊特徵值對角陣的轉換
在命令窗口輸入以下內容,創建矩陣B。
>> B=[5 3 4 8 5;6 8 7 6 9;2 6 8 2 1;2 7 9 3 9;4 5 6 7 8];
首先對矩陣B進行Schur分解,在命令窗口輸入:
>> [u,t]=schur (B) %對矩陣B進行Schur分解
然後將實舒爾形式轉化成復舒爾形式,在命令窗口輸入:
>> [U,T]=rsf2csf (u,t) %實舒爾形式轉化成復舒爾形式

###3.2.8 廣義奇異值分解
MATLAB提供了gsvd函數對矩陣進行廣義奇異值分解,其具體調用格式爲:

①[U,V,X,C,S] = gsvd(A,B)
②[U,V,X,C,S] = gsvd(A,B,0)
③sigma = gsvd (A,B)

其中,函數調用格式①返回酉矩陣U和V、一個普通方陣X、非負對角矩陣C和S,滿足A = UCX',B = VSX',C'C + S'S = I (I爲單位矩陣)。A和B的列數必須相同,行數可以不同。函數調用格式②和①基本相同,而③則返回廣義奇異值sigma值。

【例3.33】廣義奇異值分解
在命令窗口輸入以下內容,創建矩陣AO和d。
>> AO=[1 2 3 4 5 6 7 8;2 3 4 5 6 7 8 9;3 4 5 6 7 8 9 0]';
>> d=magic(3); %生成3階的魔方陣
對矩陣AO進行廣義奇異值分解,在命令窗口輸入:
>> [U,V,X,C,S] = gsvd(AO,d) %對矩陣AO進行廣義奇異值分解

###3.2.9 特徵值問題的QZ分解
MATLAB提供了qz函數對矩陣進行特徵值問題的QZ分解,該函數的調用格式爲:

①[AA,BB,Q,Z,V] = qz(A,B)
②[AA,BB,Q,Z,V] = qz(A,B,flag)

其中函數調用格式①中A、B爲方陣,返回結果AA和BB爲上三角陣,Q、Z爲正交矩陣或其列變換形式,V爲特徵向量陣,且滿足QAZ= AA 和QBZ = BB。命令行②產生由flag決定的分解結果,flag取值爲'complex'表示複數分解(默認);取值爲'real'表示實數分解。

【例3.34】特徵值問題的QZ分解
在命令窗口輸入以下內容,創建矩陣A和B。
>> A=[1 2 3 4 5;5 3 4 8 5;6 8 7 6 9;2 6 8 2 1;2 7 9 3 9];
>> B=[5 3 4 8 5;6 8 7 6 9;2 6 8 2 1;2 7 9 3 9;4 5 6 7 8];
對矩陣A、B進行特徵值問題的QZ分解,在命令窗口輸入:
>> [AA,BB,Q,Z,V] = qz(A,B) %對矩陣A、B進行特徵值問題的QZ分解

###3.2.10 海森伯格形式的分解
如果矩陣H的第一子對角線下元素都是0,則H爲海森伯格(Hessenberg)矩陣。如果矩陣是對稱矩陣,則它的海森伯格形式是對角三角陣。MATLAB可以通過相似變換將矩陣變換成這種形式,具體調用格式爲:

①H = hess(A) 返回矩陣A的海森伯格形式
②[P,H] = hess(A) P爲酉矩陣,滿足:A = PHP' 且P'P = eye(size(A))
【例3.35】海森伯格形式的分解
在命令窗口輸入以下內容,創建矩陣A。
>> A=[1 2 3 4 5;5 3 4 8 5;6 8 7 6 9;2 6 8 2 1;2 7 9 3 9;]
計算矩陣A的海森伯格形式,可在命令窗口輸入:
>> [P,H]=hess(A) %返回矩陣A的海森伯格形式

作者:德特數據
聯繫方式:[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章