Matlab 矩陣運算

說明:這一段時間用Matlab做了LDPC碼的性能仿真,過程中涉及了大量的矩陣運算,本文記錄了Matlab中矩陣的相關知識,特別的說明了稀疏矩陣和有限域中的矩陣。Matlab的運算是在矩陣意義下進行的,這裏所提到的是狹義上的矩陣,即通常意義上的矩陣。

目錄

第一部分:矩陣基本知識
一、矩陣的創建

  1. 直接輸入法
  2. 利用Matlab函數創建矩陣
  3. 利用文件創建矩陣

二、矩陣的拆分

  1. 矩陣元素
  2. 矩陣拆分
  3. 特殊矩陣

三、矩陣的運算

  1. 算術運算
  2. 關係運算
  3. 邏輯運算

四、矩陣分析

  1. 對角陣
  2. 三角陣
  3. 矩陣的轉置與旋轉
  4. 矩陣的翻轉
  5. 矩陣的逆與僞逆
  6. 方陣的行列式
  7. 矩陣的秩與跡
  8. 向量和矩陣的範數
  9. 矩陣的特徵值與特徵向量

五、字符串
六、其他

第二部分 矩陣的應用
一、稀疏矩陣

  1. 稀疏矩陣的創建
  2. 稀疏矩陣的運算
  3. 其他

二、有限域中的矩陣

內容

第一部分:矩陣基本知識(只作基本介紹,詳細說明請參考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矩陣是非奇異方陣,則A\B和B/A運算可以實現。A\B等效於A的逆左乘B矩陣,也就是inv(A)*B,而B/A等效於A矩陣的逆右乘B矩陣,也就是B*inv(A)。 對於含有標量的運算,兩種除法運算的結果相同。對於矩陣來說,左除和右除表示兩種不同的除數矩陣和被除數矩陣的關係,一般A\B≠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旋轉90º的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碼矩陣轉換爲字符串矩陣。與字符串有關的另一個重要函數是eval,其調用格式爲: eval(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 中有三列內容\begin{bmatrix}1\; 3 \; 5\\ 2 \; 4 \; 6\\ 2 \; 5 \; 8\\ 3 \; 6 \; 9\end{bmatrix},第一列是一些行下標,第二列是列下標,第三列是非零元素值。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、其他

(1) 非零元素信息
nnz(S) % 返回非零元素的個數
nonzeros(S) % 返回列向量,包含所有的非零元素
nzmax(S) % 返回分配給稀疏矩陣中非零項的總的存儲空間
(2) 查看稀疏矩陣的形狀 spy(S)
(3) find函數與稀疏矩陣
[i,j,s]=find(S)
[i,j]=find(S)
返回 S 中所有非零元素的下標和數值,S 可以是稀疏矩陣或滿矩陣。

二、有限域中的矩陣

信道編碼中的矩陣運算一般都是基於有限域的,因此需要將普通矩陣轉換爲有限域中的矩陣,使其運算在有限域GF(m)中。可以通過命令gf(data,m)將數據限制在有限域中,這樣如矩陣求逆、相加、相乘等運算就均是基於有限域GF(m)的運算了。

那麼如何將有限域元素轉換爲double型的呢?可以利用命令 double(data.x) 其中x是後綴。關於有限域的詳細情況請參考這裏

注:用LaTeX寫的矩陣顯示有問題,圖片顯示出”&”符號的在html語言下的表示”amp;”,哪位兄弟能幫忙解決下?多謝了,呵呵
解決方法:用\;代替&。估計這個問題是Latex Math插件的bug。呵呵,不知道有沒有更好的解決辦法。

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