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

猜你喜欢

转载自blog.csdn.net/huzhizhewudi/article/details/84404452