科學計算與Matlab筆記:第2章:Matlab矩陣處理

史努B發表於2018-05-08

1. 特殊矩陣

通用的特殊矩陣

>zeros函式:產生全0的矩陣,即零矩陣

>ones函式:產生全1的矩陣,即1矩陣

>eye函式:產生對角線為1的矩陣。當矩陣為方陣時則得到一個單位陣

>rand函式:產生0~1區間均勻分佈的隨機矩陣

>randn函式:產生均值為0,方差為1的標準正態分佈隨機矩陣。


zeros函式的呼叫格式:

>zeros(m): 產生mxm的零矩陣

>zeros(m,n):產生mxn零矩陣

>zeros(size(A)):產生與矩陣A同樣大小的零矩陣

>> A=zeros(2,3)

A =

     0     0     0
     0     0     0

>> zeros(size(A))

ans =

     0     0     0
     0     0     0

>> zeros(size(reshape(A,3,2)))

ans =

     0     0
     0     0
     0     0

例1 首先產生5階兩位隨機矩陣A,在產生均值為0.6,方差為0.1的5階正態分佈隨機矩陣B,最後驗證(A+B)I=IA+BI(I為單位矩陣)

>rand函式:產生0~1開區間均勻分佈的隨機數x

>fix(a+(b-a+1)*x):產生a~b區間上均勻分佈的隨機整數

>randn函式:產生均值為0,方差為1的標準正態分佈隨機數x

>u+cx:得到均值為u,方差為c^2的隨機數

>> A=fix(10+(99-10+1)*rand(5));
>> B=0.6+sqrt(0.1)*rand(5);
>> C=eye(5);
>> (A+B)*C==C*A+B*C

ans =

     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1


用於專門學科的特殊矩陣

(1)魔方矩陣

>> M=magic(3)

M =

     8     1     6
     3     5     7

     4     9     2

>n階魔方陣有1,2,3,……,n^2個整陣列成,且每行每列以及主、副對角線上各n個元素之和都相等。

>n階魔方方陣每行每列元素的的和為(1+2+3+...+n^2)/n = (n+n^3)/2

>MATLAB函式magic(n)產生一個特定的魔方陣

例2 產生8階魔方矩陣,求其每行每列元素的和。

>> M=magic(8);
>> sum(M(1,:))

ans =

   260

>> sum(M(:,1))

ans =

   260

>> trace(M)

ans =

   260


(2)範德蒙行列式

在MATLAB中,函式vander(V)生成以向量V為基礎的範德蒙矩陣

>> A=vander(1:5)

A =

     1     1     1     1     1
    16     8     4     2     1
    81    27     9     3     1
   256    64    16     4     1
   625   125    25     5     1

範德蒙矩陣常用在各種通訊系統的糾錯編碼中,如Reed-Solomon編碼以範德蒙矩陣為基礎

(3)希爾伯特矩陣

希爾伯特矩陣是著名的病態矩陣:矩陣中任何一個元素微小的變動,都會引起矩陣值以及逆矩陣的值的較大的擾動,病態程度與矩陣的階數有關,階數越高,病態程度越嚴重。

在MATLAB中,生成n階希爾伯特的函式為:hilb(n):

>> format rat   //以有理數格式顯示
>> H=hilb(4)

H =

       1              1/2            1/3            1/4     
       1/2            1/3            1/4            1/5     
       1/3            1/4            1/5            1/6     
       1/4            1/5            1/6            1/7

(4)伴隨矩陣(特徵值為多項式方程的根)

(4)伴隨矩陣

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

例如, 生成多項式(x^3 - 2x^2 - 5x + 6)的伴隨矩陣

>>    p=[1,-2,-6,6];
>> A=compan(p)

A =

       2              6             -6       
       1              0              0       
       0              1              0 

(5)帕斯卡矩陣

例3 生成5階帕斯卡矩陣,驗證他的逆矩陣的所有元素也為矩陣

>> format rat
>> P=pascal(5)

P =

       1              1              1              1              1       
       1              2              3              4              5       
       1              3              6             10             15       
       1              4             10             20             35       
       1              5             15             35             70       

>> inv(P)

ans =

       5            -10             10             -5              1       
     -10             30            -35             19             -4       
      10            -35             46            -27              6       
      -5             19            -27             17             -4       
       1             -4              6             -4              1

2. 矩陣變換

>對角矩陣:只有對角線上有非零元素的矩陣

>數量矩陣:對角線上的元素相等的對角矩陣

>單位矩陣:對角線上的元素都為1的對角矩陣

(1)提取矩陣的對角線元素

>diag(A):提取矩陣A的主對角線元素,生成一個列向量

>diag(A,k):提取矩陣A的第k條對角線元素,生成一個列向量

主對角線:k=0,向上,向下分別為k=1,2,…… /k=-1,-2,……對角線

(2)構造對角陣

>diag(V):以向量V為主對角元素,產生對角矩陣

>diag(V,k):以向量V為第k條對角元素,產生對角矩陣

例1 先建立5x5矩陣A,然後將A的第1行元素乘以1,第2行元素乘以2,……,第5行元素乘以5

>> A=[7,0,1,0,5;3,5,7,4,1;4,0,3,0,2;1,1,9,2,3;1,8,5,2,9]

A =

       7              0              1              0              5       
       3              5              7              4              1       
       4              0              3              0              2       
       1              1              9              2              3       
       1              8              5              2              9       

>> D=diag(1:5)

D =

       1              0              0              0              0       
       0              2              0              0              0       
       0              0              3              0              0       
       0              0              0              4              0       
       0              0              0              0              5       

>> D*A

ans =

       7              0              1              0              5       
       6             10             14              8              2       
      12              0              9              0              6       
       4              4             36              8             12       
       5             40             25             10             45 

要將A的各列元素分別乘以對角陣的對角線元素,如何實現?

>> A*D

ans =

       7              0              3              0             25       
       3             10             21             16              5       
       4              0              9              0             10       
       1              2             27              8             15       
       1             16             15              8             45       

三角陣

>上三角陣:矩陣的對角線以下的元素全為0的矩陣

>下三角陣:矩陣的對角線以上的元素全為0的矩陣

(1)上三角陣

>triu(A):提取矩陣A的主對角線及以上的元素

>triu(A,k):提取矩陣A的第k條對角線及以上的元素

>> triu(ones(4),-1)

ans =

       1              1              1              1       
       1              1              1              1       
       0              1              1              1       

       0              0              1              1

(2)下三角陣

在MATLAB中,提取矩陣A的下三角矩陣的函式是tril,其用法與triu函式完全相同。

>tril(A):提取矩陣A的主對角線及以下的元素

>tril(A,k):提取矩陣A的第k條對角線及以下的元素

>>  tril(ones(4),-1)

ans =

       0              0              0              0       
       1              0              0              0       
       1              1              0              0       
       1              1              1              0       

矩陣的轉轉置

>轉置運算子是小數點後面接單引號(.')

>共扼轉置,其運算子是單引號(‘),它在轉置的基礎上還要提取每個數的複共軛

>> A=[1,3;3+4i,1-2i]

A =

       1        +    0i             3        +    0i      
       3        +    4i             1        -    2i      

>> A.'

ans =

       1        +    0i             3        +    4i      
       3        +    0i             1        -    2i      

>> A'

ans =

       1        +    0i             3        -    4i      
       3        +    0i             1        +    2i      

矩陣的旋轉

rot90(A,k):將矩陣A逆時針方向旋轉90°的k倍,當k為1時可以省略

>> A=[1,3,2;-3,2,1;4,1,2]

A =

       1              3              2       
      -3              2              1       
       4              1              2       

>> rot90(A)

ans =

       2              1              2       
       3              2              1       
       1             -3              4       

>> rot90(A,2)

ans =

       2              1              4       
       1              2             -3       
       2              3              1 

>fliplr(A):對矩陣A實施左右翻轉

>flipud(A):對矩陣A實施上下翻轉

A =

       1              3              2       
      -3              2              1       
       4              1              2       

>> flipud(A)

ans =

       4              1              2       
      -3              2              1       
       1              3              2       

>> fliplr(A)

ans =

       2              3              1       
       1              2             -3       
       2              1              4       

例2 驗證魔方方陣的主對角線,副對角線元素之和相等

>> A=magic(5)

A =

      17             24              1              8             15       
      23              5              7             14             16       
       4              6             13             20             22       
      10             12             19             21              3       
      11             18             25              2              9      
>> D1=diag(A);
>> sum(D1)

ans =

      65       

>> B=flipud(A)

B =

      11             18             25              2              9       
      10             12             19             21              3       
       4              6             13             20             22       
      23              5              7             14             16       
      17             24              1              8             15 
>> D2=diag(B);
>> sum(D2)>

ans =

      65       

矩陣的求逆

>對於一個方陣A,如果存在一個與其相同階的方陣B,使得AB=BA=I(I為單位矩陣),則稱B為A的逆矩陣,當然A也是B的逆矩陣

>inv(A):求方陣A的逆矩陣


 

3. 矩陣求值

方陣的行列式

>把一個方陣看作一個行列式,並對其按行列式的規則求值,這個值就稱為方陣所對應的行列式的值

>det(A):求方陣A所對應的行列式的值

矩陣的秩

>矩陣線性無關的行數和列數成為矩陣的秩

>rank(A): 求矩陣A的秩

例2 求3~20階魔方陣的秩

>> for n=3:20
r(n)=rank(magic(n));
end
>> bar(r)
>> grid on
>> axis([2,21,0,20])

矩陣的跡

>矩陣的跡等於矩陣的對角線元素之和,也等於矩陣的特徵值之和

>trace(A):求矩陣A的跡

>> A=[1,3,2;-3,2,1;4,1,2]

A =

       1              3              2       
      -3              2              1       
       4              1              2       

>> b=trace(A)

b =

       5       

>> t=sum(diag(A))

t =

       5   

向量和矩陣的範數

矩陣或向量的範數用於定義矩陣或向量在某種意義下的長度

矩陣的條件數

>矩陣A的條件數等於A的範數與A的逆矩陣的範數的乘積

>條件數越接近於1,矩陣的效能越好,反之,矩陣的效能越差

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

>cond(A,1):計算A的1-範數下的條件數

>cond(A,2)或cond(A):計算A的2-範數下的條件數

>cond(A,inf):計算A的正無窮-範數下的條件數

例3 求2~10階希爾伯特矩陣的條件數

>> for n=2:10
c(n)=cond(hilb(n));
end
>> format long
>> c'

ans =

   1.0e+13 *

                   0
   0.000000000001928
   0.000000000052406
   0.000000001551374
   0.000000047660725
   0.000001495105864
   0.000047536735692
   0.001525757525282
   0.049315438266897
   1.602457362635516

>> c

c =

   1.0e+13 *

  Columns 1 through 5

                   0   0.000000000001928   0.000000000052406   0.000000001551374   0.000000047660725

  Columns 6 through 10

   0.000001495105864   0.000047536735692   0.001525757525282   0.049315438266897   1.602457362635516

4. 矩陣的特徵值與特徵向量

矩陣特徵值的數學定義

設A是n階方陣,如果存在常數λ和n維非零列向量x,是的等式Ax=λx成立,則稱λ為A的特徵值,x是對應特徵值λ的特徵向量

函式呼叫格式有兩種:

>E=eig(A):求矩陣A的全部特徵值,構成向量E

>[X,D]=eig(A):求矩陣A的全部特徵值,構成對角陣D,併產生矩陣X,X各列是相應的特徵向量

>> A=[1,1,0;1,0,5;1,10,2]

A =

     1     1     0
     1     0     5
     1    10     2

>> [X,D]=eig(A)

X =

   0.072196186226992   0.975064063761619   0.088619224195266
   0.523368974057523  -0.075013465822403  -0.635606218080313
   0.849042182514069  -0.208861321230112   0.766910274178584


D =

   8.249260679947781                   0                   0
                   0   0.923068166892527                   0
                   0                   0  -6.172328846840313

>> A*X(:,1)

ans =

   0.595565160284515
   4.317407098797336

   7.003970291830358

>> D(1)*X(:,1)

ans =

   0.595565160284514
   4.317407098797333

   7.003970291830355


>> R=[-1,2,0;2,-4,1;1,1,-6];
>> S=[1,2;2,3];
>> A=[R,zeros(3,2);zeros(2,3),S];
>> [X1,D1]=eig(R)

X1 =

   0.855336847706575   0.451748808798346   0.189889692402449
   0.470284611344323  -0.839453879712591  -0.511105640718618
   0.217327543786097  -0.302059923830942   0.838279743728139


D1 =

   0.099647729675864                   0                   0
                   0  -4.716463058067783                   0
                   0                   0  -6.383184671608076

>> [X2,D2]=eig(S)

X2 =

  -0.850650808352040   0.525731112119133
   0.525731112119133   0.850650808352040


D2 =

  -0.236067977499790                   0
                   0   4.236067977499790

>> [X3,D3]=eig(A)

X3 =

   0.855336847706575   0.451748808798346   0.189889692402449                   0                   0
   0.470284611344323  -0.839453879712591  -0.511105640718618                   0                   0
   0.217327543786097  -0.302059923830942   0.838279743728139                   0                   0
                   0                   0                   0  -0.850650808352040  -0.525731112119133
                   0                   0                   0   0.525731112119133  -0.850650808352040


D3 =

   0.099647729675864                   0                   0                   0                   0
                   0  -4.716463058067783                   0                   0                   0
                   0                   0  -6.383184671608076                   0                   0
                   0                   0                   0  -0.236067977499790                   0
                   0                   0                   0                   0   4.236067977499790

>>

5. 稀疏矩陣

矩陣的儲存方式:完全儲存方式+稀疏儲存方式

稀疏儲存方式只儲存矩陣的非零元素的值及其位置,即行號和列號

注意:採用稀疏儲存方式時,矩陣元素的儲存順序並沒有改變,也是按列的順序進行儲存

>> A=sparse(eye(5))

A =

   (1,1)        1
   (2,2)        1
   (3,3)        1
   (4,4)        1
   (5,5)        1

>> B=full(A)

B =

     1     0     0     0     0
     0     1     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     0     0     0     1

>> whos
  Name      Size            Bytes  Class     Attributes

  A         5x5               128  double    sparse    
  B         5x5               200  double 

>> A=sparse([1,2,2],[2,1,4],[2,5,-7])

A =

   (2,1)        5
   (1,2)        2
   (2,4)       -7

>> B=full(A)

B =

     0     2     0     0
     5     0     0    -7

>> A=[2,2,1;2,1,-1;2,4,3]

A =

     2     2     1
     2     1    -1
     2     4     3

>> B=spconvert(A)   //最後一列從小到大按行排列?

B =

   (2,1)       -1
   (2,2)        1

   (2,4)        3

>> A=[11,0,0,12,0,0;0,21,0,0,22,0;0,0,31,0,0,32;41,0,0,42,0,0;0,51,0,0,52,0]

A =

    11     0     0    12     0     0
     0    21     0     0    22     0
     0     0    31     0     0    32
    41     0     0    42     0     0
     0    51     0     0    52     0

>> [B,d]=spdiags(A)

B =

     0    11    12
     0    21    22
     0    31    32
    41    42     0
    51    52     0


d =

    -3
     0
     3

>> A=spdiags(B,d,5,6)

A =

   (1,1)       11
   (4,1)       41
   (2,2)       21
   (5,2)       51
   (3,3)       31
   (1,4)       12
   (4,4)       42
   (2,5)       22
   (5,5)       52

   (3,6)       32

>> kf1=[1;1;2;1;0];
>> k0=[2;4;6;6;1];
>> k1=[0;3;1;4;2];
>> B=[kf1,k0,k1];
>> d=[-1;0;1];
>> A=spdiags(B,d,5,5);
>> f=[0;3;2;1;5];
>> x=A\f

x =

  -0.166666666666667
   0.111111111111111
   2.722222222222222
  -3.611111111111111

   8.611111111111111

注意:當參與運算的資料物件不全是稀疏儲存矩陣時,所得結果是完全儲存形式。

相關文章