1. 程式人生 > >Matlab從入門到精通(六)--矩陣基本運算

Matlab從入門到精通(六)--矩陣基本運算

1、行向量的定義

rowvec = [1.2 3 56];

2、列向量的定義

colvec = [1.2;3;56];

3、逐個元素的分配矩陣

B(1,1) = 1 ;

B(1,2) = 2 ;

B(2,1) = 3 ;

B(2,2) = 4 ;

B =

     1     2

     3     4

注意:矩陣的下標從1開始計數

4、矩陣的輸入

直接輸入矩陣時候,矩陣元素用“空格”或者“逗號”隔開,矩陣行用“分號”隔離,整個矩陣放在方括號“[         ]”內.不必事先對矩陣維數做任何說明.

例如:

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

或者

A = [1 2 3;4 5 6;7 8 9]

還可以分行輸入:

A=[1 2 3;

        4 5 6;

          7 8 9]

注意:

         表達符號一定要在英文狀態下輸入.MATLAB對矩陣大小寫是敏感的.如果不用clear指令清楚,或者重新賦值,那麼該矩陣就會一直儲存在工作空間中,直到指令窗(Command Window)關閉.

5、矩陣、零矩陣和單位矩陣

1矩陣的所有元素全為1,零矩陣的所有元素全為零.

ones(n)                       %建立一個n×n的1矩陣

ones(m,n,……,p)    %建立一個m×n×……×p的1矩陣

ones(size(A))   %建立一個和矩陣A同樣大小的1矩陣

zeros(n)                      %建立一個n×n的0矩陣

zeros(m,n,……,p)   %建立一個m×n×……×p的0矩陣

zeros(size(A))  %建立一個和矩陣A同樣大小的0矩陣

eye(n)          %建立一個n×n的單位矩陣

eye(m,n)            %建立一個m×n的單位矩陣

eye(size(A))        %建立一個和矩陣A同樣大小的單位矩陣

例如:輸入OneMatrix = ones(2,3,2)

則結果為:

OneMatrix(:,:,1) =

     1     1     1

     1     1     1

OneMatrix(:,:,2) =

     1     1     1

     1     1     1

注意:eye命令只能用來建立二維矩陣

6、隨機數和隨機矩陣

rand                             %產生在0~1之間均勻分佈的隨機數;每呼叫一次給一個新的數值.

rand + i*rand           %產生一個複數隨機數

rand(n)                        %產生一個n×n的矩陣,其元素均為0~1之間均勻分佈的隨機數.

rand(m,n,……,p)    %產生一個m×n×……×p的矩陣,其元素均為0~1之間均勻分佈的隨機數.

randn                          %產生零均值、單位方差的正太分佈隨機數

randn(n)                     %產生一個n×n的矩陣,其元素均為零均值、單位方差的正太分佈隨機數.

randn(m,n,……,p)           %產生一個m×n×……×p的矩陣, 其元素均為零均值、單位方差的正太分佈隨機數.

7、隨機數種子

rand(‘state’)                       %返回一個有35個元素的向量,其中包含隨機發生器的當前狀態.

rand(‘state’,s)                   %設定隨機種子發生器的狀態為s

rand(‘state’,0)                   %設定隨機種子發生器為它的原始狀態

rand(‘state’,j)                    %設定隨機種子發生器為它的第j種子狀態,j為整數

rand('state',sum(100*clock));          %使用clock命令,使得隨機種子發生器在每個不同的時刻都設定為不同的狀態.

rand(‘state’,arg)                        %使用MATLAB中的隨機種子發生器.

randn(‘state’,)                   %返回一個有兩個元素的向量,其中包含正態隨機種子發生器的狀態

randn(‘state’,arg)             %根據arg設定正態隨機種子發生器,見rand.

例如

astate = rand('state'); astate(1:5)

ans =

    0.8651

    0.5121

    0.9021

    0.8186

0.6267

說明:astate(1:5)表示列出狀態向量(35個元素)中的前5個元素的值

8、從已存在的向量中產生新的矩陣(一)

diag(A)               %生成一個由矩陣A主對角線元素組成的列向量,主對角線總是從矩陣左上角開始,對於方陣來說它結束於矩陣的右下角.

diag(x)               %x為一個n維向量.生成一個n維方陣,它的主對角線元素取自向量x,其餘元素的值都為零.

diag(A,k)           %生成一個由矩陣A第k條對角線元素組成的列向量。k=0為主對角線;K<0為主對角線下第條對角線;k>0為主對角線上第K條對角線.

dialog(x,k)         %生成一個(n +)*(n+)維的矩陣,該矩陣的第k條對角線元素取自x,其餘元素為0.(n為x的維數)

例一:

A =

     1     2     3

     4     5     6

     7     8     9

diag(A)=

1

     5

     9

例二:

x = [1 2 3];

diag(x) =

     1     0     0

     0     2     0

     0     0     3

例三:(A為例一中的A)

diag(A,0) = 

     1

     5

     9

diag(A,1) =

     2

     6

diag(A,-1) =

     4

     8

例四:(x為例二中的x)

diag(x,1) =

     0     1     0     0

     0     0     2     0

     0     0     0     3

     0     0     0     0

diag(x,-2) =

     0     0     0     0     0

     0     0     0     0     0

     1     0     0     0     0

     0     2     0     0     0

     0     0     3     0     0

9、從已存在的矩陣中生成新的矩陣(二)

triu(A)                %生成一個和A同樣大小的上三角矩陣。該矩陣的主對角線及以上元素取自A中的相應元素,其餘元素都為0.

triu(A,k)             %生成一個和A同樣大小的上三角矩陣。該矩陣的第k條對角線及以上元素取自A中的相應元素,其餘元素都為0.命令triu(A,0)等價於triu(A).

tril(A)                 %生成一個和A同樣大小的下三角矩陣。該矩陣的主對角線及以下元素取自A中的相應元素,其餘元素都為0.

tril(A,k)              %生成一個和A同樣大小的下三角矩陣。該矩陣的第k條對角線及以下元素取自A中的相應元素,其餘元素都為0.命令tril(A,0)等價於tril(A).

 

對於每一個方陣A都有以下關係:

A = triu(A) +tril(A) – diag(diag(A));

A = triu(A,1) + tril(A,-1) + daig(diag(A)).

 

例一:

A =

     1     2     3

     4     5     6

     7     8     9

triu(A) =

     1     2     3

     0     5     6

     0     0     9

triu(A,1) =

     0     2     3

     0     0     6

     0     0     0

 

tril(A,-1) =

     0     0     0

     4     0     0

     7     8     0

 

例二:

B =

     1     2     3     4

     5     6     7     8

     9     1     0     5

 

triu(B) =

     1     2     3     4

     0     6     7     8

     0     0     0     5

tril(B,-1) =

     0     0     0     0

     5     0     0     0

     9     1     0     0

10、矩陣旋轉和矩陣變維

 

例一:

A =

     1     2

     3     4

     5     6

fliplr(A) = flipdim(A,2) =

     2     1

     4     3

     6     5

例二:

B =

     2     2     3

     4     6     6

     7     8    10

flipud(B) = flipdim(B,1) =

     7     8    10

     4     6     6

     2     2     3

例三:(例二中的B)

rot90(B) =

     3     6    10

     2     6     8

     2     4     7

例四:(例二中的B)

rot90(B,2) =

    10     8     7

     6     6     4

     3     2     2

例五:

OneMatrix = ones(3,4,2)

reshape(OneMatrix,3,8) =

     1     1     1     1     1     1     1     1

     1     1     1     1     1     1     1     1

     1     1     1     1     1     1     1     1

例六:(例二中的B)

repmat(B,2,3) =

     2     2     3     2     2     3     2     2     3

     4     6     6     4     6     6     4     6     6

     7     8    10     7     8    10     7     8    10

     2     2     3     2     2     3     2     2     3

     4     6     6     4     6     6     4     6     6

     7     8    10     7     8    10     7     8    10

例七:

y = 3 ;

repmat(y,2,5) =

     3     3     3     3     3

     3     3     3     3     3

例八:

E =

     1     1     1     1     1     1     1     1

     1     1     1     1     1     1     1     1

     1     1     1     1     1     1     1     1

C = zeros(3,8);

D = cat(3,E,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

ans(:,:,2) =

     0     0     0     0     0     0     0     0

     0     0     0     0     0     0     0     0

     0     0     0     0     0     0     0     0

即在矩陣E中增加了一層零元素.

11、矩陣維數的擴充套件

(1)擴充套件列向量的列

將向量x=[9,10]擴充套件成xnew=[9,10,3,2],有下列辦法:

方法一:xnew = x ;xnew(3) = 3 ;xnew(4) = 2;

方法二:xnew = [x 3 2];

方法三:tmp = [0,15]; xnew = [x tmp];

(2)擴充套件矩陣的列

將 A = [1 2;3 4]擴充套件成Anew = [1 2 11;3 4 12],有下列方法:

方法一:y = [11;12],Anew = [A y];

方法二:Anew = [A  [11;12]]

(3)擴充套件矩陣的行

將A = [1 2;3 4]擴充套件成Anew = [1 2;3 4;13 14],有下列辦法:

方法一:z = [13 14],Anew = [A; z]

方法二:Anew = [A;[13 14]]

(4)矩陣的賦值擴充套件法

A = reshape(1:9,3,3)

A =

     1     4     7

     2     5     8

     3     6     9

A(4,4) = 111;

A =

     1     4     7     0

     2     5     8     0

     3     6     9     0

     0     0     0   111

A(:,6) = 222

A =

     1     4     7     0     0   222

     2     5     8     0     0   222

     3     6     9     0     0   222

     0     0     0   111     0   222

A(5,:) = 250

A =

     1     4     7     0     0   222

     2     5     8     0     0   222

     3     6     9     0     0   222

     0     0     0   111     0   222

   250   250   250   250   250   250

12、數字序列

(1)數字序列一

i:k              %建立從i開始、步長為1、到k結束的數字序列.數字i和k不一定是整數,該序列最後一個數小於或等於k.

i:j:k            %建立建立從i開始、步長為j、到k結束的數字序列.數字i、j和k不一定是整數,該序列最後一個數小於或等於k.

(2)數字序列二

linspace(a,b)             %在區間[a,b]上建立一個有100個元素的向量,這100個數把整個區間線性分隔.

linspace(a,b,n)          %在在區間[a,b]上建立一個有n個元素的向量,這n個數把整個區間線性分隔.

logspace(a,b)            %在區間[10*a,10*b]上建立一個有50個元素的向量,這50個數把整個區間對數分隔.

logspace(ab,n)          %在區間[10*a,10*b]上建立一個有n個元素的向量,這n個數把整個區間對數分隔.

例一:

vect = 2:7

vect =     2     3     4     5     6     7

vect = 2:7.2

vect =     2     3     4     5     6     7

vect = 6:-1:2

vect =     6     5     4     3     2

vect = 1.2:-0.8:-3.2

1.2000    0.4000   -0.4000   -1.2000   -2.0000   -2.8000

注意:此時最後一個數為-2.8.

例二:

linspace(1,5,6)

ans =

    1.0000    1.8000    2.6000    3.4000    4.2000    5.0000

13、定義子陣

A(i,j,……,k)     %返回多維陣列A中下標為(i,j,……,k)的元素值.

A(:,j)                   %返回二維矩陣A中第j列列向量.

A(i,:)                   %返回二維矩陣A中第j行行向量.

A(:,j:k)                %返回二維矩陣A中的第j列,第j+1列,……,第k列列向量組成的子陣.

A(i:k,:)                %返回二維矩陣A中的第i行,第i+1行,……,第k行行向量組成的子陣.

A(i:k,j:L)             %返回二維矩陣A中的第i行到第k行行向量和第j列到第L列列向量組成的子陣.

A(:,:,……,:)     %返回矩陣A本身.

A(:)                     %將矩陣A中的每列合成一個長的列向量.

A(j:k)                  %返回一個行向量,其中的元素為A(:)中的從第j個元素到第k個元素.

A([j1,j2,……]) %返回一個行向量,其中的元素為A(:)中的第j1,j2,……元素.

A(:,[j1,j2,……])        %返回矩陣A的第j1列、第j2列、……的列向量.

A([j1,j2,……],:)        %回矩陣A的第j1行、第j2行、……的行向量.

A([i1,i2,……],[j1,j2,……])       %返回矩陣第i1行、第i2行等和第j1列、第j2列等的元素.

14、將二維矩陣合成三維矩陣

>> A1 = [1 2;3 4];

>> A2 = [3 4 ;5 6];

>> C(:,:,1)=A1;

>> C(:,:,2)=A2;

>> C

C(:,:,1) =

     1     2

     3     4

C(:,:,2) =

     3     4

     5     6

此時C為三維矩陣.

15、刪除矩陣的行

【例一】

>>  a = [1 2 3;4 5 6;7 8 9]

 

a =

 

     1     2     3

     4     5     6

     7     8     9

 

>>  a = a([2,3],:)

 

a =

 

     4     5     6

     7     8     9

【例二】

>> a = [1 2 3;4 5 6;7 8 9]

 

a =

 

     1     2     3

     4     5     6

     7     8     9

 

>> a(1,:) = []

 

a =

 

     4     5     6

     7     8     9

16、刪除矩陣的列

【例一】

>> a = [1 2 3;4 5 6;7 8 9]

 

a =

 

     1     2     3

     4     5     6

     7     8     9

 

>> a = a(:,[1,3])

 

a =

 

     1     3

     4     6

     7     9

【例二】

>> a = [1 2 3;4 5 6;7 8 9]

 

a =

 

     1     2     3

     4     5     6

     7     8     9

 

>> a(:,2) = []

 

a =

 

     1     3

     4     6

     7     9

17、陣列定址和排序

18、矩陣及陣列運算

18.1矩陣加減

兩矩陣必須同階才可進行加減運算,另外MATLAB還特別作了擴充,允許矩陣與一個數量(即1×1矩陣)進行加減運算。

例如鍵入A=[1,2,3;4,5,6;7,8,9],B=[1,4,7;2,5,8;3,6,9],則 C=A+B 的結果顯示為:

 

如果鍵入x=[-1,0,2],則y=x-1的結果為:

18.2矩陣乘法

當左乘矩陣的列數等於右乘矩陣的行數時,兩矩陣可以進行乘法。在MATLAB中,矩陣A乘以矩陣B應表示成A*B。

18.3矩陣除法

MATLAB中有兩種除法,即左除“\”與右除“/”。

若A為非奇異方陣,B為矩陣,則A\B,B/A的數學意義分別為 。在MATLAB中,這兩種運算也可以分別表示為inv(A)*B,B*inv(A)。

18.4陣列的乘除運算

18.5陣列的乘方

陣列的乘方用符號“.^”來表示,而陣列的乘方有三種形式。

1       向量的向量次方

例如:鍵入x =[1,2,3], y =[4,5,6],z=x.^y,則結果為:

z=

  1  32  729

它的數學意義是 。

2       向量的數量次方

例如:鍵入x =[1,2,3],z=x.^2,則結果為:

z=

  1  4  9

它的數學意義是 。

3       數量的向量次方

例如:鍵入x =[1,2,3],z=2.^x,則結果為:

z=

  2  4  8

它的數學意義是 。

 

19、向量的關係運算

MATLAB提供了6種關係運算符:<(小於)、<=(小於或等於)、>(大於)、 >=(大於或等於)、 ==(等於)、 ~=(不等於)。

關係運算的運演算法則為:

1  當兩個比較量是標量時,直接比較兩數的大小。若關係成立,關係表示式的值為1,否則為0。

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

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

例如

若鍵入x=(1<2)

則x =

      1

若鍵入A=[1,2,3;2,3,4],B=[1,2,2;2,2,3],C=(A<=B)

則 C =

     1     1     0

     1     0     0

若鍵入A=[1,2,3;2,3,4],b=1,C=(A<=b)

則 C =

     1     0     0

     0     0     0

20、向量的邏輯運算

MATLAB提供了3種邏輯運算子:&(與)、|(或)、~(非)。

邏輯運算的運演算法則為:

1  在邏輯運算中,確認非零元為真,用1表示,零元素為假,用0表示。

2  設參與邏輯運算的是兩個標量a和b,那麼

a&b  a,b全為非零時,運算結果為1,否則為0。

a|b   a,b中只要有一個非零時,運算結果為1;只有當a,b全為零時,運算結果為0。

~a   當a為零時,運算結果為1;當a非零時,運算結果為0。

3  若參與邏輯運算的是兩個同維矩陣,那麼運算將對矩陣相同位置上的元素按標量規則逐個進行。最終運算的結果是一個與原矩陣同維的矩陣,其元素由0或1組成。

4  若參與邏輯運算的一個是標量,一個是矩陣,那麼運算將在標量與矩陣中的每個元素之間按標量規則逐個進行。最終運算結果是一個與矩陣同維的矩陣,其元素是由0或1組成。

5  若對一個矩陣做邏輯非運算,那麼將對矩陣中的每個元素按標量規則逐個取邏輯非,最終運算的結果是一個與原矩陣同維的矩陣,其元素由0或1組成。

6  在算術、關係、邏輯運算中,算術運算優先順序最高,邏輯運算優先順序最低。

例如,若鍵入A=[0,2,3;0,2,0],B=[0,0,0;2,3,4],A&B,A|B,~A,則其結果分別為

ans =

     0     0     0

     0     1     0

ans =

     0     1     1

     1     1     1

ans =

     1     0     0

     1     0     1

 

21、判斷矩陣是否為空

Isempty(Matrix) ;

如果矩陣為空則返回1,否則返回0;

22、求行列式及化階梯形

【例一】:求矩陣A的行列式:det(A)

例:A=[1 2;3 4] ;

則det(A) = -2 ;

【例二】:化階梯形

A =

 

     4     5     6

     1     2     3

     7     8     9

 

>> rref(A)

 

ans =

 

     1     0    -1

     0     1     2

     0     0     0

23、求矩陣的轉置及矩陣的秩

23.1矩陣的轉置

求矩陣A的轉置矩陣:A’

轉置符號為單引號.

23.2求矩陣的秩

例:

>> X = [1 3 5;5 -9 0; 32 1 18];

>> rank(X)

 

ans =

 

     3

24、求矩陣的逆矩陣及跡

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

求矩陣A的跡:trace(A)

例:a= [1 2;3 4];

trace(A) = 5.

25、矩陣及向量的最大值、最小值

25.1向量的最大值及最小值

  1. max(P) :返回向量P的最大值,如果P中包含複數元素,則按模取最大值。
  2. [y,i] = max(P) :返回向量P的最大值存入y,最大值的序號存入i,如果P中包含複數元素,則按模取最大值。
  3. 求向量的最小值的函式min(P)用法同max(P)。

25.2矩陣的最大值及最小值

  1. max(A) : 返回一個行向量,向量的第i個元素為矩陣A的第i列的最大值。
  2. [y,u] = max(A) : 返回行向量y和u,y記錄A的每列的最大值,u記錄每列最大值的行號。
  3. max(A,[],dim) : dim取1時,該函式和max(A完全相同;dim取2時,該函式返回一個列向量,其第i個元素是A矩陣的第i行的最大值。
  4. 求矩陣的最小值函式min(A)用法同max(A)。
  5. 使用max(max(A))可以求出矩陣中的最大元素,同理min(min(A))可以求出矩陣中的最小元素。

26、計算矩陣大小及元素個數

26.1計算矩陣大小

size(A),返回的是矩陣A的列數和行數;

size(A,1),返回矩陣A的行數;

size(A,2),返回矩陣A的列數。

 

>>A = [1 2 5;3 4 9];

則size(A) = 2 3

size(A,1) = 2

size(A,2) = 3

26.2計算矩陣中的元素個數

使用函式numel()

當矩陣為一個行向量或者一個列向量時候,返回的該向量的長度,當矩陣為M*N時,返回值為M*N.

例:A = [1 2 3 4;5 6 7 8];

則numel(A) = 8.

26.3計算矩陣的維數

n = ndims(A);返回矩陣的維數,若A為三維陣列,則n=3.

 

27、LU分解

矩陣的三角分解又稱LU分解,它的目的是將一個矩陣分解成一個下三角矩陣L和一個上三角矩陣U的乘積,即A=LU。

函式:  lu

格式  [L,U] = lu(X)     %U為上三角陣,L為下三角陣或其變換形式,滿足LU=X。

[L,U,P] = lu(X)   %U為上三角陣,L為下三角陣,P為單位矩陣的行變換矩陣,滿足LU=PX。

例:

>> X = [1 3 5;5 -9 0; 32 1 18];

>> [p,q,r] = lu(X)

 

p =

 

    1.0000         0         0

    0.1563    1.0000         0

    0.0313   -0.3242    1.0000

 

 

q =

 

   32.0000    1.0000   18.0000

         0   -9.1563   -2.8125

         0         0    3.5256

 

 

r =

 

     0     0     1

     0     1     0

     1     0     0

28、QR分解(求正交矩陣)

將矩陣A分解成一個正交矩陣與一個上三角矩陣的乘積。

函式:  qr

格式:  [Q,R] = qr(A)     %求得正交矩陣Q和上三角陣R,Q和R滿足A=QR。

例:

>> X = [1 3 5;5 -9 0; 32 1 18];

>> [p ,q] = qr(X)

 

p =

 

    0.0309    0.3156    0.9484

    0.1543   -0.9390    0.3075

    0.9875    0.1368   -0.0777

 

 

q =

 

   32.4037   -0.3086   17.9300

         0    9.5344    4.0415

         0         0    3.3436

29、求特徵值及特徵向量

函式  eig

格式  d = eig(A)         %求矩陣A的特徵值d,以向量形式存放d。

【例一】

>> X = [1 3 5;5 -9 0; 32 1 18];

>> D = eig(X)

 

D =

 

   24.8632

   -3.7328

  -11.1305

【例二】

>> X = [1 3 5;5 -9 0; 32 1 18];

>> [d,v] = eig(X)

 

d =

 

   -0.2087   -0.4880    0.3641

   -0.0308   -0.4632   -0.8545

   -0.9775    0.7398   -0.3706

 

 

v =

 

   24.8632         0         0

         0   -3.7328         0

         0         0  -11.1305

說明:矩陣d的列向量構成特徵向量,v中的正對角線上的元素為特徵值。

30、奇異值分解

函式  svd

格式  s = svd (X)          %返回矩陣X的奇異值向量

[U,S,V] = svd (X)    %返回一個與X同大小的對角矩陣S,兩個酉矩陣U和V,且滿足= U*S*V'。若A為m×n陣,則U為m×m陣,V為n×n陣。奇異值在S的對角線上,非負且按降序排列。

[U,S,V] = svd (X,0)   %得到一個“有效大小”的分解,只計算出矩陣U的前n列,矩陣S的大小為n×n。

【例】:

>> X = [1 3 5;5 -9 0; 32 1 18];

>> S = svd(X)

 

S =

 

   37.1225

   10.2231

    2.7220

 

>> [U,S,V] = svd(X)

 

U =

 

   -0.0902    0.4116   -0.9069

   -0.1159   -0.9088   -0.4009

   -0.9892    0.0689    0.1296

 

 

S =

 

   37.1225         0         0

         0   10.2231         0

         0         0    2.7220

 

 

V =

 

   -0.8707   -0.1885    0.4543

   -0.0058    0.9276    0.3736

   -0.4918    0.3227   -0.8087

 

>> [U,S,V] = svd(X,0)

 

U =

 

   -0.0902    0.4116   -0.9069

   -0.1159   -0.9088   -0.4009

   -0.9892    0.0689    0.1296

 

 

S =

 

   37.1225         0         0

         0   10.2231         0

         0         0    2.7220

 

 

V =

 

   -0.8707   -0.1885    0.4543

   -0.0058    0.9276    0.3736

   -0.4918    0.3227   -0.8087