天天看點

Matlab矩陣操作

第一部分:矩陣基本知識

矩陣是進行資料處理和運算的基本元素。在MATLAB中

a、通常意義上的數量(标量)可看成是”1*1″的矩陣;

b、n維矢量可看成是”n*1″的矩陣;

c、多項式可由它的系數矩陣完全确定。

一、矩陣的建立

在MATLAB中建立矩陣有以下規則:

a、矩陣元素必須在”[ ]”内;

b、矩陣的同行元素之間用空格(或”,”)隔開;

c、矩陣的行與行之間用”;”(或回車符)隔開;

d、矩陣的元素可以是數值、變量、表達式或函數;

e、矩陣的尺寸不必預先定義。

下面介紹四種矩陣的建立方法:

1、直接輸入法

最簡單的建立矩陣的方法是從鍵盤直接輸入矩陣的元素,輸入的方法按照上面的規則。建立向量的時候可以利用冒号表達式,冒号表達式可以産生一個行向量,一般格式是: e1:e2:e3,其中e1為初始值,e2為步長,e3為終止值。還可以用linspace函數産生行向量,其調用格式為:linspace(a,b,n) ,其中a和b是生成向量的第一個和最後一個元素,n是元素總數。可以看出來linspace(a,b,n)與a:(b-a)/(n-1):b等價。

2、利用MATLAB函數建立矩陣

基本矩陣函數如下:

(1) ones()函數:産生全為1的矩陣,ones(n):産生n*n維的全1矩陣,ones(m,n):産生m*n維的全1矩陣;

(2) zeros()函數:産生全為0的矩陣;

(3) rand()函數:産生在(0,1)區間均勻分布的随機陣;

(4) eye()函數:産生機關陣;

(5) randn()函數:産生均值為0,方差為1的标準正态分布随機矩陣。

3、利用檔案建立矩陣

當矩陣尺寸較大或為經常使用的資料矩陣,則可以将此矩陣儲存為檔案,在需要時直接将檔案利用load指令調入工作環境中使用即可。同時可以利用指令reshape對調入的矩陣進行重排。reshape(A,m,n),它在矩陣總元素保持不變的前提下,将矩陣A重新排成m*n的二維矩陣。

二、矩陣的拆分

1.矩陣元素

可以通過下标(行列索引)引用矩陣的元素,如 Matrix(m,n)。也可以采用矩陣元素的序号來引用矩陣元素。矩陣元素的序号就是相應元素在記憶體中的排列順序。在MATLAB中,矩陣元素按列存儲,先第一列,再第二列,依次類推。序号(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列的元素。

(2) 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表示某一維的末尾元素下标。

利用空矩陣删除矩陣的元素:

在MATLAB中,定義[]為空矩陣。給變量X賦空矩陣的語句為X=[]。注意,X=[]與clear X不同,clear是将X從工作空間中删除,而空矩陣則存在于工作空間中,隻是維數為0。

3、特殊矩陣

(1) 魔方矩陣魔方矩陣有一個有趣的性質,其每行、每列及兩條對角線上的元素和都相等。對于n階魔方陣,其元素由1,2,3,…,n2共n2個整數組成。MATLAB提供了求魔方矩陣的函數magic(n),其功能是生成一個n階魔方陣。

(2) 範得蒙矩陣範得蒙(Vandermonde)矩陣最後一列全為1,倒數第二列為一個指定的向量,其他各列是其後列與倒數第二列的點乘積。可以用一個指定向量生成一個範得蒙矩陣。在MATLAB中,函數vander(V)生成以向量V為基礎向量的範得蒙矩陣。

(3) 希爾伯特矩陣在MATLAB中,生成希爾伯特矩陣的函數是hilb(n)。使用一般方法求逆會因為原始資料的微小擾動而産生不可靠的計算結果。MATLAB中,有一個專門求希爾伯特矩陣的逆的函數invhilb(n),其功能是求n階的希爾伯特矩陣的逆矩陣。

(4) 托普利茲矩陣托普利茲(Toeplitz)矩陣除第一行第一列外,其他每個元素都與左上角的元素相同。生成托普利茲矩陣的函數是toeplitz(x,y),它生成一個以x為第一列,y為第一行的托普利茲矩陣。這裡x, y均為向量,兩者不必等長。toeplitz(x)用向量x生成一個對稱的托普利茲矩陣。

(5) 伴随矩陣 MATLAB生成伴随矩陣的函數是compan(p),其中p是一個多項式的系數向量,高次幂系數排在前,低次幂排在後。

(6) 帕斯卡矩陣我們知道,二次項(x+y)n展開後的系數随n的增大組成一個三角形表,稱為楊輝三角形。由楊輝三角形表組成的矩陣稱為帕斯卡(Pascal)矩陣。函數pascal(n)生成一個n階帕斯卡矩陣。

三、矩陣的運算

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)。對于含有标量的運算,兩種除法運算的結果相同。對于矩陣來說,左除和右除表示兩種不同的除數矩陣和被除數矩陣的關系,一般AB≠B/A。

(4) 矩陣的乘方 一個矩陣的乘方運算可以表示成A^x,要求A為方陣,x為标量。

(5) 矩陣的轉置 對實數矩陣進行行列互換,對複數矩陣,共轭轉置,特殊的,操作符.’共轭不轉置(見點運算);

(6) 點運算在MATLAB中,有一種特殊的運算,因為其運算符是在有關算術運算符前面加點,是以叫點運算。點運算符有.*、./、.和.^。兩矩陣進行點運算是指它們的對應元素進行相關運算,要求兩矩陣的維參數相同。

2、關系運算

MATLAB提供了6種關系運算符:<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)、~=(不等于)。關系運算符的運算法則為:

(1) 當兩個比較量是标量時,直接比較兩數的大小。若關系成立,關系表達式結果為1,否則為0;

(2) 當參與比較的量是兩個維數相同的矩陣時,比較是對兩矩陣相同位置的元素按标量關系運算規則逐個進行,并給出元素比較結果。最終的關系運算的結果是一個維數與原矩陣相同的矩陣,它的元素由0或1組成;

(3) 當參與比較的一個是标量,而另一個是矩陣時,則把标量與矩陣的每一個元素按标量關系運算規則逐個比較,并給出元素比較結果。最終的關系運算的結果是一個維數與原矩陣相同的矩陣,它的元素由0或1組成。

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) 在算術、關系、邏輯運算中,算術運算優先級最高,邏輯運算優先級最低。

四、矩陣分析

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)對角陣,其第m條對角線的元素即為向量V的元素。

2、三角陣

三角陣又進一步分為上三角陣和下三角陣,所謂上三角陣,即矩陣的對角線以下的元素全為0的一種矩陣,而下三角陣則是對角線以上的元素全為0的一種矩陣。

(1) 上三角矩陣 求矩陣A的上三角陣的MATLAB函數是triu(A)。 triu(A)函數也有另一種形式triu(A,k),其功能是求矩陣A的第k條對角線以上的元素。

(2) 下三角矩陣在MATLAB中,提取矩陣A的下三角矩陣的函數是tril(A)和tril(A,k),其用法與提取上三角矩陣的函數triu(A)和triu(A,k)完全相同。

3、矩陣的轉置與旋轉

(1) 矩陣的轉置 轉置運算符是單撇号(’)。

(2) 矩陣的旋轉 利用函數rot90(A,k)将矩陣A旋轉90o的k倍,當k為1時可省略。

4、矩陣的翻轉

對矩陣實施左右翻轉是将原矩陣的第一列和最後一列調換,第二列和倒數第二列調換,…,依次類推。矩陣A實施左右翻轉的函數是fliplr(A),對矩陣A實施上下翻轉的函數是flipud(A)。

5、矩陣的逆與僞逆

(1) 矩陣的逆 對于一個方陣A,如果存在一個與其同階的方陣B,使得:AB=BA=I (I為機關矩陣) 則稱B為A的逆矩陣,當然,A也是B的逆矩陣。求方陣A的逆矩陣可調用函數inv(A)。

(2) 矩陣的僞逆如果矩陣A不是一個方陣,或者A是一個非滿秩的方陣時,矩陣A沒有逆矩陣,但可以找到一個與A的轉置矩陣A’同型的矩陣B,使得:ABA=A,BAB=B 此時稱矩陣B為矩陣A的僞逆,也稱為廣義逆矩陣。在MATLAB中,求一個矩陣僞逆的函數是pinv(A)。

6、方陣的行列式

把一個方陣看作一個行列式,并對其按行列式的規則求值,這個值就稱為矩陣所對應的行列式的值。在MATLAB中,求方陣A所對應的行列式的值的函數是det(A)。

7、矩陣的秩與迹

(1) 矩陣的秩 矩陣線性無關的行數與列數稱為矩陣的秩。在MATLAB中,求矩陣秩的函數是rank(A)。

(2) 矩陣的迹矩陣的迹等于矩陣的對角線元素之和,也等于矩陣的特征值之和。在MATLAB中,求矩陣的迹的函數是trace(A)。

8、向量和矩陣的範數

矩陣或向量的範數用來度量矩陣或向量在某種意義下的長度。範數有多種方法定義,其定義不同,範數值也就不同。

(1) 向量的3種常用範數及其計算函數 在MATLAB中,求向量範數的函數為:

a、norm(V)或norm(V,2):計算向量V的2-範數;

b、norm(V,1):計算向量V的1-範數;

c、norm(V,inf):計算向量V的∞-範數。

(2) 矩陣的範數及其計算函數 MATLAB提供了求3種矩陣範數的函數,其函數調用格式與求向量的範數的函數完全相同。

(3) 矩陣的條件數 在MATLAB中,計算矩陣A的3種條件數的函數是:

a、cond(A,1) 計算A的1-範數下的條件數;

b、cond(A)或cond(A,2) 計算A的2-範數數下的條件數;

c、cond(A,inf) 計算A的 ∞-範數下的條件數。

9、 矩陣的特征值與特征向量

在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的特征值和特征向量。

五、字元串

在MATLAB中,字元串是用單撇号括起來的字元序列。MATLAB将字元串當作一個行向量,每個元素對應一個字元,其辨別方法和數值向量相同。也可以建立多行字元串矩陣。字元串是以ASCII碼形式存儲的。abs和double函數都可以用來擷取字元串矩陣所對應的ASCII碼數值矩陣。相反,char函數可以把ASCII碼矩陣轉換為字元串矩陣。與字元串有關的另一個重要函數是,其調用格式為: (t) 其中t為字元串。它的作用是把字元串的内容作為對應的MATLAB語句來執行。

六、其他

檢視矩陣非零元素的分布spy(A);

第二部分 矩陣的應用

一、稀疏矩陣

對于一個 n 階矩陣,通常需要 n2 的存儲空間,當 n 很大時,進行矩陣運算時會占用大量的記憶體空間和運算時間。在許多實際問題中遇到的大規模矩陣中通常含有大量0元素,這樣的矩陣稱為稀疏矩陣。Matlab支援稀疏矩陣,隻存儲矩陣的非零元素。由于不存儲那些”0″元素,也不對它們進行操作,進而節省記憶體空間和計算時間,其計算的複雜性和代價僅僅取決于稀疏矩陣的非零元素的個數,這在矩陣的存儲空間和計算時間上都有很大的優點。

矩陣的密度定義為矩陣中非零元素的個數除以矩陣中總的元素個數。對于低密度的矩陣,采用稀疏方式存儲是一種很好的選擇。

1、稀疏矩陣的建立

(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為稀疏元素的稀疏矩陣。此外,還有一些和稀疏矩陣操作有關的函數。full(A):傳回和稀疏存儲矩陣A對應的完全存儲方式矩陣。

(2) 直接建立稀疏矩陣 S=sparse(i,j,s,m,n),其中i 和j 分别是矩陣非零元素的行和列名額向量,s 是非零元素值向量,m,n 分别是矩陣的行數和列數。

(3) 從檔案中建立稀疏矩陣利用load和spconvert函數可以從包含一系列下标和非零元素的文本檔案中輸入稀疏矩陣。例:設文本檔案 T.txt 中有三列内容,第一列是一些行下标,第二列是列下标,第三列是非零元素值。load T.txt S=spconvert(T)。

(4) 稀疏帶狀矩陣的建立 S=spdiags(B,d,m,n) 其中m 和n 分别是矩陣的行數和列數;d是長度為p的整數向量,它指定矩陣S的對角線位置;B是全元素矩陣,用來給定S對角線位置上的元素,行數為min(m,n),列數為p 。

(5) 其它稀疏矩陣建立函數

S=speye(m,n)

S=speye(size(A)) % has the same size as A

S=buchy % 一個内置的稀疏矩陣(鄰接矩陣)

等等

2、稀疏矩陣的運算

稀疏存儲矩陣隻是矩陣的存儲方式不同,它的運算規則與普通矩陣是一樣的,可以直接參與運算。是以,Matlab中對滿矩陣的運算和函數同樣可用在稀疏矩陣中。結果是稀疏矩陣還是滿矩陣,取決于運算符或者函數。當參與運算的對象不全是稀疏存儲矩陣時,所得結果一般是完全存儲形式。

3、其他