MATLAB矩陣及其運算
第2章 MATLAB矩陣及其運算 2.1 變數和數據操作 2.2 MATLAB矩陣 2.3 MATLAB運算 2.4 矩陣分析 2.5 矩陣的超越函數 2.6 字元串 2.7 結構數據和單元數據 2.8 稀疏矩陣
2.1 變數和數據操作
2.1.1 變數與賦值 1.變數命名 在MATLAB 6.5中,變數名是以字母開頭,後接字母、數字或下劃線的字元序列,最多63個字元。在MATLAB中,變數名區分字母的大小寫。
2.賦值語句 (1) 變數=表達式 (2) 表達式其中表達式是用運算符將有關運算量連接起來的式子,其結果是一個矩陣。
例2-1 計算表達式的值,並顯示計算結果。 在MATLAB命令窗口輸入命令: x=1+2i;y=3-sqrt(17); z=(cos(abs(x+y))-sin(78*pi/180))/(x+abs(y)) 其中pi和i都是MATLAB預先定義的變數,分別代表代表圓周率π和虛數單位。 輸出結果是: z = -0.3488 + 0.3286i
2.1.2 預定義變數
在MATLAB工作空間中,還駐留幾個由系統本身定義的變數。例如,用pi表示圓周率π的近似值,用i,j表示虛數單位。 預定義變數有特定的含義,在使用時,應盡量避免對這些變數重新賦值。
2.1.3 內存變數的管理 1.內存變數的刪除與修改 MATLAB工作空間窗口專門用於內存變數的管理。在工作空間窗口中可以顯示所有內存變數的屬性。當選中某些變數後,再單擊Delete按鈕,就能刪除這些變數。當選中某些變數後,再單擊Open按鈕,將進入變數編輯器。通過變數編輯器可以直接觀察變數中的具體元素,也可修改變數中的具體元素。
clear命令用於刪除MATLAB工作空間中的變數。who和whos這兩個命令用於顯示在MATLAB工作空間中已經駐留的變數名清單。who命令只顯示出駐留變數的名稱,whos在給出變數名的同時,還給出它們的大小、所佔位元組數及數據類型等信息。
2.內存變數文件 利用MAT文件可以把當前MATLAB工作空間中的一些有用變數長久地保留下來,擴展名是.mat。MAT文件的生成和裝入由save和load命令來完成。常用格式為: save 文件名 [變數名表] [-append][-ascii] load 文件名 [變數名表][-ascii]
其中,文件名可以帶路徑,但不需帶擴展名.mat,命令隱含一定對.mat文件進行操作。變數名表中的變數個數不限,只要內存或文件中存在即可,變數名之間以空格分隔。當變數名表省略時,保存或裝入全部變數。-ascii選項使文件以ASCII格式處理,省略該選項時文件將以二進位格式處理。save命令中的-append選項控制將變數追加到MAT文件中。
2.1.4 MATLAB常用數學函數 MATLAB提供了許多數學函數,函數的自變數規定為矩陣變數,運演算法則是將函數逐項作用於矩陣的元素上,因而運算的結果是一個與自變數同維數的矩陣。 函數使用說明: (1) 三角函數以弧度為單位計算。 (2) abs函數可以求實數的絕對值、複數的模、字元串的ASCII碼值。 (3) 用於取整的函數有fix、floor、ceil、round,要注意它們的區別。 (4)rem與mod函數的區別。rem(x,y)和mod(x,y)要求x,y必須為相同大小的實矩陣或為標量。
2.1.5 數據的輸出格式 MATLAB用十進位數表示一個常數,具體可採用日常記數法和科學記數法兩種表示方法。 在一般情況下,MATLAB內部每一個數據元素都是用雙精度數來表示和存儲的。數據輸出時用戶可以用format命令設置或改變數據輸出格式。format命令的格式為: format 格式符 其中格式符決定數據的輸出格式
2.2 MATLAB矩陣
2.2.1 矩陣的建立 1.直接輸入法 最簡單的建立矩陣的方法是從鍵盤直接輸入矩陣的元素。具體方法如下:將矩陣的元素用方括弧括起來,按矩陣行的順序輸入各元素,同一行的各元素之間用空格或逗號分隔,不同行的元素之間用分號分隔。
2.利用M文件建立矩陣 對於比較大且比較複雜的矩陣,可以為它專門建立一個M文件。下面通過一個簡單例子來說明如何利用M文件創建矩陣。
例2-2 利用M文件建立MYMAT矩陣。 (1) 啟動有關編輯程序或MATLAB文本編輯器,並輸入待建矩陣: (2) 把輸入的內容以純文本方式存檔(設文件名為mymatrix.m)。 (3)在MATLAB命令窗口中輸入mymatrix,即運行該M文件,就會自動建立一個名為MYMAT的矩陣,可供以後使用。
3.利用冒號表達式建立一個向量 冒號表達式可以產生一個行向量,一般格式是: e1:e2:e3 其中e1為初始值,e2為步長,e3為終止值。 在MATLAB中,還可以用linspace函數產生行向量。其調用格式為: linspace(a,b,n) 其中a和b是生成向量的第一個和最後一個元素,n是元素總數。 顯然,linspace(a,b,n)與a:(b-a)/(n-1):b等價。 4.建立大矩陣 大矩陣可由方括弧中的小矩陣或向量建立起來。
2.2.2 矩陣的拆分 1.矩陣元素 通過下標引用矩陣的元素,例如A(3,2)=200 採用矩陣元素的序號來引用矩陣元素。矩陣元素的序號就是相應元素在內存中的排列順序。在MATLAB中,矩陣元素按列存儲,先第一列,再第二列,依次類推。例如 A=[1,2,3;4,5,6]; A(3) ans = 2 顯然,序號(Index)與下標(Subscript )是一一對應的,以m×n矩陣A為例,矩陣元素A(i,j)的序號為(j-1)*m+i。其相互轉換關係也可利用sub2ind和ind2sub函數求得。
2.矩陣拆分 (1) 利用冒號表達式獲得子矩陣 ① A(:,j)表示取A矩陣的第j列全部元素;A(i,:)表示A矩陣第i行的全部元素;A(i,j)表示取A矩陣第i行、第j列的元素。 ② A(i:i+m,:)表示取A矩陣第i~i+m行的全部元素;A(:,k:k+m)表示取A矩陣第k~k+m列的全部元素,A(i:i+m,k:k+m)表示取A矩陣第i~i+m行內,並在第k~k+m列中的所有元素。 此外,還可利用一般向量和end運算符來表示矩陣下標,從而獲得子矩陣。end表示某一維的末尾元素下標。
(2) 利用空矩陣刪除矩陣的元素 在MATLAB中,定義[]為空矩陣。給變數X賦空矩陣的語句為X=[]。注意,X=[]與clear X不同,clear是將X從工作空間中刪除,而空矩陣則存在於工作空間中,只是維數為0。
2.2.3 特殊矩陣 1.通用的特殊矩陣 常用的產生通用特殊矩陣的函數有: zeros:產生全0矩陣(零矩陣)。 ones:產生全1矩陣(幺矩陣)。 eye:產生單位矩陣。 rand:產生0~1間均勻分布的隨機矩陣。 randn:產生均值為0,方差為1的標準正態分布隨機矩陣。
例2-3 分別建立3×3、3×2和與矩陣A同樣大小的零矩陣。(1) 建立一個3×3零矩陣。 zeros(3) (2) 建立一個3×2零矩陣。zeros(3,2) (3) 設A為2×3矩陣,則可以用zeros(size(A))建立一個與矩陣A同樣大小零矩陣。A=[1 2 3;4 5 6]; %產生一個2×3階矩陣Azeros(size(A)) %產生一個與矩陣A同樣大小的零矩陣
例2-4 建立隨機矩陣: (1) 在區間[20,50]內均勻分布的5階隨機矩陣。(2) 均值為0.6、方差為0.1的5階正態分布隨機矩陣。 命令如下: x=20+(50-20)*rand(5)y=0.6+sqrt(0.1)*randn(5) 此外,常用的函數還有reshape(A,m,n),它在矩陣總元素保持不變的前提下,將矩陣A重新排成m×n的二維矩陣。
2.用於專門學科的特殊矩陣 (1) 魔方矩陣 魔方矩陣有一個有趣的性質,其每行、每列及兩條對角線上的元素和都相等。對於n階魔方陣,其元素由1,2,3,…,n2共n2個整數組成。MATLAB提供了求魔方矩陣的函數magic(n),其功能是生成一個n階魔方陣。
例2-5 將101~125等25個數填入一個5行5列的表格中,使其每行每列及對角線的和均為565。 M=100+magic(5)
(2) 范得蒙矩陣 范得蒙(Vandermonde)矩陣最後一列全為1,倒數第二列為一個指定的向量,其他各列是其後列與倒數第二列的點乘積。可以用一個指定向量生成一個范得蒙矩陣。在MATLAB中,函數vander(V)生成以向量V為基礎向量的范得蒙矩陣。例如,A=vander([1;2;3;5])即可得到上述范得蒙矩陣。
(3) 希爾伯特矩陣 在MATLAB中,生成希爾伯特矩陣的函數是hilb(n)。 使用一般方法求逆會因為原始數據的微小擾動而產生不可靠的計算結果。MATLAB中,有一個專門求希爾伯特矩陣的逆的函數invhilb(n),其功能是求n階的希爾伯特矩陣的逆矩陣。
例2-6 求4階希爾伯特矩陣及其逆矩陣。 命令如下: format rat %以有理形式輸出 H=hilb(4) H=invhilb(4)
(4) 托普利茲矩陣 托普利茲(Toeplitz)矩陣除第一行第一列外,其他每個元素都與左上角的元素相同。生成托普利茲矩陣的函數是toeplitz(x,y),它生成一個以x為第一列,y為第一行的托普利茲矩陣。這裡x, y均為向量,兩者不必等長。toeplitz(x)用向量x生成一個對稱的托普利茲矩陣。例如 T=toeplitz(1:6)
(5) 伴隨矩陣 MATLAB生成伴隨矩陣的函數是compan(p),其中p是一個多項式的係數向量,高次冪係數排在前,低次冪排在後。例如,為了求多項式的x3-7x+6的伴隨矩陣,可使用命令: p=[1,0,-7,6]; compan(p)
(6) 帕斯卡矩陣 我們知道,二次項(x+y)n展開後的係數隨n的增大組成一個三角形表,稱為楊輝三角形。由楊輝三角形表組成的矩陣稱為帕斯卡(Pascal)矩陣。函數pascal(n)生成一個n階帕斯卡矩陣。
例2-7 求(x+y)5的展開式。 在MATLAB命令窗口,輸入命令:pascal(6) 矩陣次對角線上的元素1,5,10,10,5,1即為展開式的係數。
2.3 MATLAB運算 2.3.1算術運算 1.基本算術運算 MATLAB的基本算術運算有:+(加)、-(減)、*(乘)、/(右除)、(左除)、^(乘方)。 注意,運算是在矩陣意義下進行的,單個數據的算術運算只是一種特例。
(1) 矩陣加減運算 假定有兩個矩陣A和B,則可以由A+B和A-B實現矩陣的加減運算。運算規則是:若A和B矩陣的維數相同,則可以執行矩陣的加減運算,A和B矩陣的相應元素相加減。如果A與B的維數不相同,則MATLAB將給出錯誤信息,提示用戶兩個矩陣的維數不匹配。
(2) 矩陣乘法 假定有兩個矩陣A和B,若A為m×n矩陣,B為n×p矩陣,則C=A*B為m×p矩陣。
(3) 矩陣除法 在MATLAB中,有兩種矩陣除法運算:和/,分別表示左除和右除。如果A矩陣是非奇異方陣,則AB和B/A運算可以實現。AB等效於A的逆左乘B矩陣,也就是inv(A)*B,而B/A等效於A矩陣的逆右乘B矩陣,也就是B*inv(A)。 對於含有標量的運算,兩種除法運算的結果相同,如3/4和43有相同的值,都等於0.75。又如,設a=[10.5,25],則a/5=5a=[2.10005.0000]。對於矩陣來說,左除和右除表示兩種不同的除數矩陣和被除數矩陣的關係。對於矩陣運算,一般AB≠B/A。
(4) 矩陣的乘方 一個矩陣的乘方運算可以表示成A^x,要求A為方陣,x為標量。 2.點運算 在MATLAB中,有一種特殊的運算,因為其運算符是在有關算術運算符前面加點,所以叫點運算。點運算符有.*、./、.和.^。兩矩陣進行點運算是指它們的對應元素進行相關運算,要求兩矩陣的維參數相同。
2.3.2 關係運算 MATLAB提供了6種關係運算符:<(小於)、<=(小於或等於)、>(大於)、>=(大於或等於)、==(等於)、~=(不等於)。它們的含義不難理解,但要注意其書寫方法與數學中的不等式符號不盡相同。
關係運算符的運演算法則為: (1) 當兩個比較量是標量時,直接比較兩數的大小。若關係成立,關係表達式結果為1,否則為0。 (2) 當參與比較的量是兩個維數相同的矩陣時,比較是對兩矩陣相同位置的元素按標量關係運算規則逐個進行,並給出元素比較結果。最終的關係運算的結果是一個維數與原矩陣相同的矩陣,它的元素由0或1組成。
(3) 當參與比較的一個是標量,而另一個是矩陣時,則把標量與矩陣的每一個元素按標量關係運算規則逐個比較,並給出元素比較結果。最終的關係運算的結果是一個維數與原矩陣相同的矩陣,它的元素由0或1組成。
例2-8 產生5階隨機方陣A,其元素為[10,90]區間的隨機整數,然後判斷A的元素是否能被3整除。 (1) 生成5階隨機方陣A。 A=fix((90-10+1)*rand(5)+10) (2) 判斷A的元素是否可以被3整除。 P=rem(A,3)==0 其中,rem(A,3)是矩陣A的每個元素除以3的餘數矩陣。此時,0被擴展為與A同維數的零矩陣,P是進行等於(==)比較的結果矩陣。
2.3.3 邏輯運算 MATLAB提供了3種邏輯運算符:&(與)、|(或)和~(非)。 邏輯運算的運演算法則為: (1) 在邏輯運算中,確認非零元素為真,用1表示,零元素為假,用0表示。 (2) 設參與邏輯運算的是兩個標量a和b,那麼, a&b a,b全為非零時,運算結果為1,否則為0。 a|b a,b中只要有一個非零,運算結果為1。 ~a 當a是零時,運算結果為1;當a非零時,運算結果為0。
(3) 若參與邏輯運算的是兩個同維矩陣,那麼運算將對矩陣相同位置上的元素按標量規則逐個進行。最終運算結果是一個與原矩陣同維的矩陣,其元素由1或0組成。 (4) 若參與邏輯運算的一個是標量,一個是矩陣,那麼運算將在標量與矩陣中的每個元素之間按標量規則逐個進行。最終運算結果是一個與矩陣同維的矩陣,其元素由1或0組成。(5) 邏輯非是單目運算符,也服從矩陣運算規則。(6) 在算術、關係、邏輯運算中,算術運算優先順序最高,邏輯運算優先順序最低。
例2-9 建立矩陣A,然後找出大於4的元素的位置。 (1) 建立矩陣A。A=[4,-65,-54,0,6;56,0,67,-45,0] (2) 找出大於4的元素的位置。 find(A>4)
2.4 矩陣分析 2.4.1 對角陣與三角陣 1.對角陣 只有對角線上有非0元素的矩陣稱為對角矩陣,對角線上的元素相等的對角矩陣稱為數量矩陣,對角線上的元素都為1的對角矩陣稱為單位矩陣。
(1) 提取矩陣的對角線元素 設A為m×n矩陣,diag(A)函數用於提取矩陣A主對角線元素,產生一個具有min(m,n)個元素的列向量。 diag(A)函數還有一種形式diag(A,k),其功能是提取第k條對角線的元素。 (2) 構造對角矩陣 設V為具有m個元素的向量,diag(V)將產生一個m×m對角矩陣,其主對角線元素即為向量V的元素。 diag(V)函數也有另一種形式diag(V,k),其功能是產生一個n×n(n=m+)對角陣,其第k條對角線的元素即為向量V的元素。
例2-10 先建立5×5矩陣A,然後將A的第一行元素乘以1,第二行乘以2,…,第五行乘以5。A=[17,0,1,0,15;23,5,7,14,16;4,0,13,0,22;10,12,19,21,3;...11,18,25,2,19]; D=diag(1:5); D*A %用D左乘A,對A的每行乘以一個指定常數
2.三角陣 三角陣又進一步分為上三角陣和下三角陣,所謂上三角陣,即矩陣的對角線以下的元素全為0的一種矩陣,而下三角陣則是對角線以上的元素全為0的一種矩陣。
(1) 上三角矩陣 求矩陣A的上三角陣的MATLAB函數是triu(A)。triu(A)函數也有另一種形式triu(A,k),其功能是求矩陣A的第k條對角線以上的元素。例如,提取矩陣A的第2條對角線以上的元素,形成新的矩陣B。 (2) 下三角矩陣 在MATLAB中,提取矩陣A的下三角矩陣的函數是tril(A)和tril(A,k),其用法與提取上三角矩陣的函數triu(A)和triu(A,k)完全相同。
2.4.2 矩陣的轉置與旋轉 1.矩陣的轉置 轉置運算符是單撇號(『)。 2.矩陣的旋轉 利用函數rot90(A,k)將矩陣A旋轉90o的k倍,當k為1時可省略。3.矩陣的左右翻轉 對矩陣實施左右翻轉是將原矩陣的第一列和最後一列調換,第二列和倒數第二列調換,…,依次類推。MATLAB對矩陣A實施左右翻轉的函數是fliplr(A)。 4.矩陣的上下翻轉 MATLAB對矩陣A實施上下翻轉的函數是flipud(A)。
2.4.3 矩陣的逆與偽逆 1.矩陣的逆 對於一個方陣A,如果存在一個與其同階的方陣B,使得: A·B=B·A=I (I為單位矩陣) 則稱B為A的逆矩陣,當然,A也是B的逆矩陣。 求一個矩陣的逆是一件非常煩瑣的工作,容易出錯,但在MATLAB中,求一個矩陣的逆非常容易。求方陣A的逆矩陣可調用函數inv(A)。 例2-11用求逆矩陣的方法解線性方程組。 Ax=b 其解為: x=A-1b
2.矩陣的偽逆 如果矩陣A不是一個方陣,或者A是一個非滿秩的方陣時,矩陣A沒有逆矩陣,但可以找到一個與A的轉置矩陣A『同型的矩陣B,使得: A·B·A=A B·A·B=B 此時稱矩陣B為矩陣A的偽逆,也稱為廣義逆矩陣。在MATLAB中,求一個矩陣偽逆的函數是pinv(A)。
2.4.4 方陣的行列式 把一個方陣看作一個行列式,並對其按行列式的規則求值,這個值就稱為矩陣所對應的行列式的值。在MATLAB中,求方陣A所對應的行列式的值的函數是det(A)。
2.4.5 矩陣的秩與跡 1.矩陣的秩 矩陣線性無關的行數與列數稱為矩陣的秩。在MATLAB中,求矩陣秩的函數是rank(A)。 2.矩陣的跡 矩陣的跡等於矩陣的對角線元素之和,也等於矩陣的特徵值之和。在MATLAB中,求矩陣的跡的函數是trace(A)。
2.4.6 向量和矩陣的範數 矩陣或向量的範數用來度量矩陣或向量在某種意義下的長度。範數有多種方法定義,其定義不同,範數值也就不同。
1.向量的3種常用範數及其計算函數 在MATLAB中,求向量範數的函數為: (1)norm(V)或norm(V,2):計算向量V的2—範數。 (2) norm(V,1):計算向量V的1—範數。 (3)norm(V,inf):計算向量V的∞—範數。2.矩陣的範數及其計算函數 MATLAB提供了求3種矩陣範數的函數,其函數調用格式與求向量的範數的函數完全相同。
2.4.7 矩陣的條件數 在MATLAB中,計算矩陣A的3種條件數的函數是:(1) cond(A,1) 計算A的1—範數下的條件數。(2) cond(A)或cond(A,2) 計算A的2—範數數下的條件數。(3) cond(A,inf) 計算A的 ∞—範數下的條件數。
2.4.8 矩陣的特徵值與特徵向量 在MATLAB中,計算矩陣A的特徵值和特徵向量的函數是eig(A),常用的調用格式有3種: (1) E=eig(A):求矩陣A的全部特徵值,構成向量E。 (2) [V,D]=eig(A):求矩陣A的全部特徵值,構成對角陣D,並求A的特徵向量構成V的列向量。(3) [V,D]=eig(A,『nobalance』):與第2種格式類似,但第2種格式中先對A作相似變換後求矩陣A的特徵值和特徵向量,而格式3直接求矩陣A的特徵值和特徵向量。
例2-12 用求特徵值的方法解方程。 3x5-7x4+5x2+2x-18=0p=[3,-7,0,5,2,-18]; A=compan(p); %A的伴隨矩陣 x1=eig(A) %求A的特徵值 x2=roots(p) %直接求多項式p的零點
2.5 矩陣的超越函數 1.矩陣平方根sqrtm sqrtm(A)計算矩陣A的平方根。 2.矩陣對數logmlogm(A)計算矩陣A的自然對數。此函數輸入參數的條件與輸出結果間的關係和函數sqrtm(A)完全一樣3.矩陣指數expm、expm1、expm2、expm3 expm(A)、expm1(A)、expm2(A)、expm3(A)的功能都求矩陣指數eA。 4.普通矩陣函數funm funm(A,『fun』)用來計算直接作用於矩陣A的由『fun』指定的超越函數值。當fun取sqrt時,funm(A,『sqrt』)可以計算矩陣A的平方根,與sqrtm(A)的計算結果一樣。
2.6 字元串 在MATLAB中,字元串是用單撇號括起來的字元序列。MATLAB將字元串當作一個行向量,每個元素對應一個字元,其標識方法和數值向量相同。也可以建立多行字元串矩陣。
字元串是以ASCII碼形式存儲的。abs和double函數都可以用來獲取字元串矩陣所對應的ASCII碼數值矩陣。相反,char函數可以把ASCII碼矩陣轉換為字元串矩陣。
例2-13 建立一個字元串向量,然後對該向量做如下處理:(1) 取第1~5個字元組成的子字元串。 (2) 將字元串倒過來重新排列。 (3)將字元串中的小寫字母變成相應的大寫字母,其餘字元不變。 (4) 統計字元串中小寫字母的個數。
命令如下: ch=『ABc123d4e56Fg9』; subch=ch(1:5) %取子字元串 revch=ch(end:-1:1) %將字元串倒排k=find(ch>=『a』&ch<=『z』); %找小寫字母的位置ch(k)=ch(k)-(『a』-『A』); %將小寫字母變成相應的大寫字母 char(ch) length(k) %統計小寫字母的個數
與字元串有關的另一個重要函數是eval,其調用格式為: eval(t) 其中t為字元串。它的作用是把字元串的內容作為對應的MATLAB語句來執行。
2.7 結構數據和單元數據 2.7.1 結構數據 1.結構矩陣的建立與引用 結構矩陣的元素可以是不同的數據類型,它能將一組具有不同屬性的數據納入到一個統一的變數名下進行管理。建立一個結構矩陣可採用給結構成員賦值的辦法。具體格式為: 結構矩陣名.成員名=表達式 其中表達式應理解為矩陣表達式。
2.結構成員的修改 可以根據需要增加或刪除結構的成員。例如要給結構矩陣a增加一個成員x4,可給a中任意一個元素增加成員x4: a(1).x4=『410075』; 但其他成員均為空矩陣,可以使用賦值語句給它賦確定的值。 要刪除結構的成員,則可以使用rmfield函數來完成。例如,刪除成員x4:a=rmfield(a,『x4』); 3.關於結構的函數 除了一般的結構數據的操作外,MATLAB還提供了部分函數來進行結構矩陣的操作。
2.7.2 單元數據 1.單元矩陣的建立與引用 建立單元矩陣和一般矩陣相似,只是矩陣元素用大括弧括起來。 可以用帶有大括弧下標的形式引用單元矩陣元素。例如b{3,3}。單元矩陣的元素可以是結構或單元數據。 可以使用celldisp函數來顯示整個單元矩陣,如celldisp(b)。還可以刪除單元矩陣中的某個元素。2.關於單元的函數 MATLAB還提供了部分函數用於單元的操作。
2.8 稀疏矩陣 2.8.1 矩陣存儲方式 MATLAB的矩陣有兩種存儲方式:完全存儲方式和稀疏存儲方式。 1.完全存儲方式 完全存儲方式是將矩陣的全部元素按列存儲。以前講到的矩陣的存儲方式都是按這個方式存儲的,此存儲方式對稀疏矩陣也適用。
2.稀疏存儲方式 稀疏存儲方式僅存儲矩陣所有的非零元素的值及其位置,即行號和列號。在MATLAB中,稀疏存儲方式也是按列存儲的。 注意,在講稀疏矩陣時,有兩個不同的概念,一是指矩陣的0元素較多,該矩陣是一個具有稀疏特徵的矩陣,二是指採用稀疏方式存儲的矩陣。
2.8.2 稀疏存儲方式的產生 1.將完全存儲方式轉化為稀疏存儲方式 函數A=sparse(S)將矩陣S轉化為稀疏存儲方式的矩陣A。當矩陣S是稀疏存儲方式時,則函數調用相當於A=S。 sparse函數還有其他一些調用格式: sparse(m,n):生成一個m×n的所有元素都是0的稀疏矩陣。sparse(u,v,S)--:u,v,S是3個等長的向量。S是要建立的稀疏矩陣的非0元素,u(i)、v(i)分別是S(i)的行和列下標,該函數建立一個max(u)行、max(v)列並以S為稀疏元素的稀疏矩陣。 此外,還有一些和稀疏矩陣操作有關的函數。例如 [u,v,S]=find(A):返回矩陣A中非0元素的下標和元素。這裡產生的u,v,S可作為sparse(u,v,S)的參數。 full(A):返回和稀疏存儲矩陣A對應的完全存儲方式矩陣。
2.產生稀疏存儲矩陣 只把要建立的稀疏矩陣的非0元素及其所在行和列的位置表示出來後由MATLAB自己產生其稀疏存儲,這需要使用spconvert函數。調用格式為:B=spconvert(A) 其中A為一個m×3或m×4的矩陣,其每行表示一個非0元素,m是非0元素的個數,A每個元素的意義是: (i,1) 第i個非0元素所在的行。 (i,2) 第i個非0元素所在的列。 (i,3) 第i個非0元素值的實部。 (i,4) 第i個非0元素值的虛部,若矩陣的全部元素都是實數,則無須第四列。 該函數將A所描述的一個稀疏矩陣轉化為一個稀疏存儲矩陣。
例2-15 根據表示稀疏矩陣的矩陣A,產生一個稀疏存儲方式矩陣B。 命令如下:A=[2,2,1;3,1,-1;4,3,3;5,3,8;6,6,12]; B=spconvert(A)
3.帶狀稀疏存儲矩陣 用spdiags函數產生帶狀稀疏矩陣的稀疏存儲,調用格式是: A=spdiags(B,d,m,n) 其中,參數m,n為原帶狀矩陣的行數與列數。B為r×p階矩陣,這裡r=min(m,n),p為原帶狀矩陣所有非零對角線的條數,矩陣B的第i列即為原帶狀矩陣的第i條非零對角線。
4.單位矩陣的稀疏存儲 單位矩陣只有對角線元素為1,其他元素都為0,是一種具有稀疏特徵的矩陣。函數eye產生一個完全存儲方式的單位矩陣。MATLAB還有一個產生稀疏存儲方式的單位矩陣的函數,這就是speye。函數speye(m,n)返回一個m×n的稀疏存儲單位矩陣。
2.8.3 稀疏矩陣應用舉例 稀疏存儲矩陣只是矩陣的存儲方式不同,它的運算規則與普通矩陣是一樣的。所以,在運算過程中,稀疏存儲矩陣可以直接參与運算。當參與運算的對象不全是稀疏存儲矩陣時,所得結果一般是完全存儲形式。
推薦閱讀:
※婚姻的四則運算
※八字的兩種運算方法
※c++矩陣運算庫Eigen
※卜運算元三首 攤破浣溪沙三首
※【詩藝花蹊】詞牌:卜運算元