朝花夕拾之Matlab矩阵运算

不羁岁月 提交于 2020-01-29 15:21:44

矩阵运算

1.  加、减运算

运算符:“+”和“-”分别为加、减运算符。

运算规则:对应元素相加、减,即按线性代数中矩阵的“十”,“一”运算进行。

例1-22  

>>A=[1, 1, 1; 1, 2, 3; 1, 3, 6]

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

>>A+B=A+B

>>A-B=A-B

结果显示:A+B=

9   2   7

4   7  10

5  12   8

A-B=

-7    0   -5

-2    -3   -4

-3    -6    4

2.  乘法

运算符:*

运算规则:按线性代数中矩阵乘法运算进行,即放在前面的矩阵的各行元素,分别与放在后面的矩阵的各列元素对应相乘并相加。

1.两个矩阵相乘

例1-23

>>X= [2  3  4  5;

      1  2  2  1];

>>Y=[0  1  1;

     1  1  0;

     0  0  1;

     1  0  0];

Z=X*Y

结果显示为:

Z=

   8  5  6

   3  3  3

2.矩阵的数乘:数乘矩阵

上例中:a=2*X

则显示:a =

4  6  8  10

2  4  4  2

向量的点乘(内积):维数相同的两个向量的点乘。

数组乘法:

A.*B表示A与B对应元素相乘。

3.向量点积

函数  dot

格式  C = dot(A,B)       %若A、B为向量,则返回向量A与B的点积,A与B长度相同;若为矩阵,则A与B有相同的维数。

C = dot(A,B,dim)    %在dim维数中给出A与B的点积

例      >>X=[-1  0  2];

>>Y=[-2  -1  1];

>>Z=dot(X, Y)

则显示:Z =

4

还可用另一种算法:

sum(X.*Y)

ans=

     4

 

 

4.向量叉乘

在数学上,两向量的叉乘是一个过两相交向量的交点且垂直于两向量所在平面的向量。在Matlab中,用函数cross实现。

函数  cross

格式  C = cross(A,B)   %若A、B为向量,则返回A与B的叉乘,即C=A×B,A、B必须是3个元素的向量;若A、B为矩阵,则返回一个3×n矩阵,其中的列是A与B对应列的叉积,A、B都是3×n矩阵。

C = cross(A,B,dim)   %在dim维数中给出向量A与B的叉积。A和B必须具有相同的维数,size(A,dim)和size(B,dim)必须是3。

例1-24  计算垂直于向量(1, 2, 3)和(4, 5, 6)的向量。

   >>a=[1  2  3];

   >>b=[4  5  6];

   >>c=cross(a,b)

结果显示:

    c=

       -3     6    -3

可得垂直于向量(1, 2, 3)和(4, 5, 6)的向量为±(-3, 6, -3)

5.混合积

混合积由以上两函数实现:

例1-25  计算向量a=(1, 2, 3)、b=(4, 5, 6)和c=(-3, 6, -3) 的混合积

解:

>>a=[1  2  3]; b=[4  5  6]; c=[-3  6  -3];

>>x=dot(a, cross(b, c))

结果显示:x =

              54

注意:先叉乘后点乘,顺序不可颠倒。

6.矩阵的卷积和多项式乘法

函数  conv

格式  w = conv(u,v)   %u、v为向量,其长度可不相同。

说明  长度为m的向量序列u和长度为n的向量序列v的卷积(Convolution)定义为:式中:w向量序列的长度为(m+n-1),当m=n时,

w(1) = u(1)*v(1)

w(2) = u(1)*v(2)+u(2)*v(1)

w(3) = u(1)*v(3)+u(2)*v(2)+u(3)*v(1)

w(n) = u(1)*v(n)+u(2)*v(n-1)+ … +u(n)*v(1)

w(2*n-1) = u(n)*v(n)

例1-26  展开多项式

解:>> w=conv([1,2,2],conv([1,4],[1,1]))

w =

    1     7    16    18     8

>> P=poly2str(w,'s')    %将w表示成多项式

P =

  s^4 + 7 s^3 + 16 s^2 + 18 s + 8

7.反褶积(解卷)和多项式除法运算

函数  deconv

格式  [q,r] = deconv(v,u)  %多项式v除以多项式u,返回商多项式q和余多项式r。

注意:v、u、q、r都是按降幂排列的多项式系数向量。

例1-27                                 ,则其卷积为

>>u = [1   2   3   4]

>>v = [10   20   30]

>>c = conv(u,v)

c =

   10     40     100     160     170     120

则反褶积为

>>[q,r] = deconv(c,u)

q =

   10    20    30

r =

   0      0      0      0      0      0

8.张量积

 

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

>> C=kron(A,B)

C =

    1     2     3     2     4     6

    4     5     6     8     10    12

    7     8     9     14    16    18

    3     6     9     4     8     12

    12    15    18    16    20    24

    21    24    27    28    32    36

1.2.3  集合运算

1.两个集合的交集

函数  intersect

格式  c = intersect(a,b)         %返回向量a、b的公共部分,即c= a∩b。

c = intersect(A,B,'rows')   %A、B为相同列数的矩阵,返回元素相同的行。[c,ia,ib] = intersect(a,b)   %c为a、b的公共元素,ia表示公共元素在a中的位置,ib表示公共元素在b中位置。

例1-29

>> A=[1 2 3 4;1 2 4 6;6 7 1 4]

A =

    1     2     3     4

    1     2     4     6

    6     7     1     4

>> B=[1 2 3 8;1 1 4 6;6 7 1 4]

B =

    1     2     3     8

    1     1     4     6

    6     7     1     4

>> C=intersect(A,B,'rows')

C =

    6     7     1     4

例1-30

>> A = [1 9 6 20]; B = [1 2 3 4 6 10 20];

>> [c,ia,ib] = intersect(A,B)

c =

     1     6    20

ia =

     1     3     4

ib =

     1     5     7

2.检测集合中的元素

函数  ismember

格式  k = ismember(a,S)         

%当a中元素属于S时,k取1,否则,k取0。k = ismember(A,S,'rows')   %A、S有相同的列,返回行相同k取1,不相同取0的列向量。

例1-31

>> S=[0  2  4  6  8  10  12  14  16  18  20];

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

>> k=ismember(a,S)

k =0     1     0     1     0     1     %1表示相同元素的位置

例1-32

>> A=[1 2 3 4;1 2 4 6;6 7 1 4]

>> B=[1 2 3 8;1 1 4 6;6 7 1 4]

>> k=ismember(A,B,'rows')

k =

     0

     0

     1         %1表示元素相同的行

3.两集合的差

函数  setdiff

格式  c = setdiff(a,b)         %返回属于a但不属于b的不同元素的集合,C = a-b。

c = setdiff(A,B,'rows')   %返回属于A但不属于B的不同行

[c,i] = setdiff(…)        %c与前面一致,i表示c中元素在A中的位置。

例1-33

>> A = [1 7 9 6 20]; B = [1 2 3 4 6 10 20];

>> c=setdiff(A,B)

c =

     7     9

例1-34

>> A=[1 2 3 4;1 2 4 6;6 7 1 4]

>> B=[1 2 3 8;1 1 4 6;6 7 1 4]

>> c=setdiff(A,B,'rows')

c =

     1     2     3     4

     1     2     4     6

4.两个集合交集的非(异或)

函数  setxor

格式  c = setxor(a,b)         %返回集合a、b交集的非

c = setxor(A,B,'rows')   %返回矩阵A、B交集的非,A、B有相同列数。

[c,ia,ib] = setxor(…)     %ia、ib表示c中元素分别在a (或A)、b(或B)中位置

例1-35

>> A=[1  2  3  4];

>> B=[2  4  5  8];

>> C=setxor(A,B)

C =

     1     3     5     8

例1-36

>> A=[1 2 3 4;1 2 4 6;6 7 1 4]

A =

     1     2     3     4

     1     2     4     6

     6     7     1     4

>> B=[1 2 3 8;1 1 4 6;6 7 1 4]

B =

     1     2     3     8

     1     1     4     6

     6     7     1     4

>> [C,ia,ib]=setxor(A,B,'rows')

C =

     1     1     4     6

     1     2     3     4

     1     2     3     8

     1     2     4     6

ia =

     1

     2

ib =

     2

     1

5.两集合的并集

函数  union

格式  c = union(a,b)         

%返回a、b的并集,即c = a∪b。c = union(A,B,'rows')   %返回矩阵A、B不同行向量构成的大矩阵,其中相同行向量只取其一。

[c,ia,ib] = union(…)     %ia、ib分别表示c中行向量在原矩阵(向量)中的位置

例1-37

>> A=[1 2 3 4];

>> B=[2 4 5 8];

>> c=union(A,B)

则结果为

c =

     1     2     3     4     5     8

例1-38

>> A=[1 2 3 4;1 2 4 6]

A =

     1     2     3     4

     1     2     4     6

>> B=[1 2 3 8;1 1 4 6]

B =

     1     2     3     8

     1     1     4     6

>> [c,ia,ib]=union(A,B,'rows')

c =

     1     1     4     6

     1     2     3     4

     1     2     3     8

     1     2     4     6

ia =

     1

     2

ib =

     2

     1

6.取集合的单值元素

函数

格式  b = unique (a)         %取集合a的不重复元素构成的向量

b = unique (A,'rows')   %返回A、B不同行元素组成的矩阵

[b,i,j] = unique (…)     %i、j体现b中元素在原向量(矩阵)中的位置

例1-39

>> A=[1 1 2 2 4 4 6  4  6]

A =

     1     1     2     2     4     4     6     4     6

>> [c,i,j]=unique(A)

c =

     1     2     4     6

i =

     2     4     8     9

j =

   1     1     2     2     3     3     4     3     4

例1-40

>> A=[1 2 2 4;1 1 4 6;1 1 4 6]

A =

   1     2     2     4

     1     1     4     6

     1     1     4     6

>> [c,i,j]=unique(A,'rows')

c =

     1     1     4     6

     1     2     2     4

i =

     3

     1

j =

     2

     1

     1

1.2.4  除法运算

Matlab提供了两种除法运算:左除(\)和右除(/)。一般情况下,x=a\b是方程a*x =b的解,而x=b/a是方程x*a=b的解。

例:a=[1  2  3; 4  2  6; 7  4  9]  b=[4; 1; 2];

x=a\b

则显示:x=

-1.5000

           2.0000

0.5000

如果a为非奇异矩阵,则a\b和b/a可通过a的逆矩阵与b阵得到:

       a\b = inv(a)*b

       b/a = b*inv(a)

数组除法:

A./B表示A中元素与B中元素对应相除。

1.2.5  矩阵乘方

运算符:^

运算规则:

(1)当A为方阵,P为大于0的整数时,A^P表示A的P次方,即A自乘P次;P为小于0的整数时,A^P表示A-1的P次方。

(2)当A为方阵,p为非整数时,则其中V为A的特征向量,为特征值对角矩阵。如果有重根,以上指令不成立。

(3)标量的矩阵乘方PA,标量的矩阵乘方定义为式中V,D取自特征值分解AV=AD。

(4)标量的数组乘方P.^A,标量的数组乘方定义为数组乘方:A.^P:表示A的每个元素的P次乘方。

1.2.6  矩阵函数

命令  方阵指数

函数  expm

格式  Y = expm(A)   %使用Pade近似算法计算eA,这是一个内部函数,A为方阵。

      Y=expm1(A)   %使用一个M文件和内部函数相同的算法计算eA

      Y=expm2(A)   %使用泰勒级数计算eA

      Y=expm3(A)   %使用特征值和特征向量计算eA

命令  矩阵的对数

函数  logm

格式  Y = logm(X)         %计算矩阵X的对数,它是expm(X)的反函数。

[Y,esterr] = logm(X)   %esterr为相对残差的估计值:norm(expm(Y)-X)/norm(X)

例1-41

>> A=[1 1 0;0 0 2;0 0 -1];

>> Y=expm(A)

Y =

   2.7183    1.7183    1.0862

        0    1.0000    1.2642

        0         0    0.3679

>> A=logm(Y)

A =

   1.0000    1.0000    0.0000

      0          0             2.0000

      0          0              -1.0000

命令  方阵的函数

函数  funm

格式  F = funm(A,fun)        %A为方阵,计算由fun指定的A的矩阵函数,fun可以是任意基本函数,如sin、cos等等,例如:funm(A, ’exp’)=expm(A)。

[F,esterr] = funm(A,fun)   %esterr为结果所产生的相对误差的估计值。

命令  矩阵的方根

函数  sqrtm

格式  X = sqrtm(A)   %矩阵A的平方根A1/2,相当于X*X=A,求X。若A的特征值有非负实部,则X是唯一的;若A的特征值有负的实部,则X为复矩阵;若A为奇异矩阵,则X不存在。

[X,resnorm] = sqrtm(A)       % resnorm为结果产生的相对误差

[X,alpha,condest] = sqrtm(A)   % alpha为稳定因子,condest为结果的条件数的估计值。

命令  矩阵A的多项式

函数  polyvalm

格式  polyvalm(P, A)   %P为多项式系数向量,方阵A为多项式变量,返回多项式值。

7  矩阵转置

运算符:′

运算规则:若矩阵A的元素为实数,则与线性代数中矩阵的转置相同。

若A为复数矩阵,则A转置后的元素由A对应元素的共轭复数构成。

若仅希望转置,则用如下命令:A.′。

8  方阵的行列式

函数  det

格式  d = det(X)    %返回方阵X的多项式的值

例1-42

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

A =

   1     2     3

     4     5     6

     7     8     9

>> D=det(A)

D =

     0

9  逆与伪逆

命令  逆

函数  inv格式  Y=inv(X)   %求方阵X的逆矩阵。若X为奇异阵或近似奇异阵,将给出警告信息。

例1-43  求

的逆矩阵

方法一

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

>>Y=inv(A)或Y=A^(-1)

则结果显示为

 Y =

      1.0000    3.0000   -2.0000

      -1.5000   -3.0000    2.5000

      1.0000    1.0000   -1.0000

方法二:由增广矩阵

进行初等行变换

>>B=[1, 2, 3, 1, 0, 0; 2, 2, 1, 0, 1, 0; 3, 4, 3, 0, 0, 1];

>>C=rref(B)     %化行最简形

>>X=C(:, 4:6)    %取矩阵C中的A^(-1)部分

显示结果如下:

C =

    1.0000         0         0    1.0000    3.0000   -2.0000

         0    1.0000         0   -1.5000   -3.0000    2.5000

         0         0    1.0000    1.0000    1.0000   -1.0000

X =

    1.0000    3.0000   -2.0000

   -1.5000   -3.0000    2.5000

    1.0000    1.0000   -1.0000

例1-44

>> A=[2 1 -1;2 1 2;1 -1 1];

>> format rat    %用有理格式输出

>> D=inv(A)

D =

     1/3           0           1/3     

      0           1/3         -2/3     

    -1/3          1/3           0      

命令  伪逆

函数  pinv

格式  B = pinv(A)      %求矩阵A的伪逆

      B = pinv(A, tol)   %tol为误差:max(size(A))*norm(A)*eps

说明  当矩阵为长方阵时,方程AX=I和XA=I至少有一个无解,这时A的伪逆能在某种程度上代表矩阵的逆,若A为非奇异矩阵,则pinv(A) = inv(A)。

例1-45

>> A=magic(5);   %产生5阶魔方阵。

>> A=A(:,1:4)    %取5阶魔方阵的前4列元素构成矩阵A。

A =

    17    24     1     8

    23     5     7    14

     4     6    13    20

    10    12    19    21

    11    18    25     2

>> X=pinv(A)    %计算A的伪逆

X =

   -0.0041    0.0527   -0.0222   -0.0132    0.0069

    0.0437   -0.0363    0.0040    0.0033    0.0038

   -0.0305    0.0027   -0.0004    0.0068    0.0355

    0.0060   -0.0041    0.0314    0.0211   -0.0315

10  矩阵的迹

函数  trace

格式  b=trace (A)   %返回矩阵A的迹,即A的对角线元素之和

函数  rank

格式  k = rank (A)      %求矩阵A的秩

k = rank (A,tol)   %tol为给定误差

11  特殊运算

1.矩阵对角线元素的抽取

函数  diag

格式  X = diag(v,k)   %以向量v的元素作为矩阵X的第k条对角线元素,当k=0时,v为X的主对角线;当k>0时,v为上方第k条对角线;当k<0时,v为下方第k条对角线。

X = diag(v)    %以v为主对角线元素,其余元素为0构成X。

v = diag(X,k)   %抽取X的第k条对角线元素构成向量v。k=0:抽取主对角线元素;k>0:抽取上方第k条对角线元素;k<0抽取下方第k条对角线元素。

v = diag(X)    %抽取主对角线元素构成向量v。

例1-46

>> v=[1 2 3];

>> x=diag(v,-1)

x =

     0     0     0     0

     1     0     0     0

     0     2     0     0

     0     0     3     0

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

A =

     1     2     3

     4     5     6

     7     8     9

>> v=diag(A,1)

v =

     2

     6

2.上三角阵和下三角阵的抽取

函数  tril   %取下三角部分

格式  L = tril(X)     %抽取X的主对角线的下三角部分构成矩阵L

L = tril(X,k)    %抽取X的第k条对角线的下三角部分;k=0为主对角线;k>0为主对角线以上;k<0为主对角线以下。

函数  triu    %取上三角部分

格式  U = triu(X)    %抽取X的主对角线的上三角部分构成矩阵U

U = triu(X,k)   %抽取X的第k条对角线的上三角部分;k=0为主对角线;k>0为主对角线以上;k<0为主对角线以下。

例1-47

>> A=ones(4)    %产生4阶全1阵

A =

   1     1     1     1

     1     1     1     1

     1     1     1     1

     1     1     1     1

>> L=tril(A,1)    %取下三角部分

L =

     1     1     0     0

     1     1     1     0

     1     1     1     1

     1     1     1     1

>> U=triu(A,-1)    %取上三角部分

U =

     1     1     1     1

     1     1     1     1

     0     1     1     1

     0     0     1     1

3.矩阵的变维

矩阵的变维有两种方法,即用“:”和函数“reshape”,前者主要针对2个已知维数矩阵之间的变维操作;而后者是对于一个矩阵的操作。

(1)“:”变维

例1-48

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

A =

     1     2     3     4     5     6

     6     7     8     9     0     1

>> B=ones(3,4)

B =

     1     1     1     1

     1     1     1     1

     1     1     1     1

>> B(:)=A(:)

B =

     1     7     4     0

     6     3     9     6

     2     8     5     1

(2)Reshape函数变维

格式  B = reshape(A,m,n)       %返回以矩阵A的元素构成的m×n矩阵B

B = reshape(A,m,n,p,…)   %将矩阵A变维为m×n×p×…

B = reshape(A,[m n p…])   %同上

B = reshape(A,siz)        %由siz决定变维的大小,元素个数与A中元素个数

相同。

例1-49  矩阵变维

>> a=[1:12];

>> b=reshape(a,2,6)

b =

     1     3     5     7     9    11

     2     4     6     8    10    12

4.矩阵的变向

(1)矩阵旋转

函数

格式  B = rot90 (A)    %将矩阵A逆时针方向旋转90°

B = rot90 (A,k)   %将矩阵A逆时针方向旋转(k×90°),k可取正负整数。

例1-50

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

A =

     1     2     3

     4     5     6

     7     8     9

>> Y1=rot90(A),Y2=rot90(A,-1)

Y1 =     %逆时针方向旋转

    3     6     9

    2     5     8

    1     4     7

Y2 =     %顺时针方向旋转

    7     4     1

    8     5     2

    9     6     3

(2)矩阵的左右翻转

函数  fliplr

格式  B = fliplr(A)   %将矩阵A左右翻转

(3)矩阵的上下翻转

函数  flipud

格式  B = flipud(A)   %将矩阵A上下翻转

例1-51

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

A =

     1     2     3

     4     5     6

>> B1=fliplr(A),B2=flipud(A)

B1 =

    3     2     1

    6     5     4

B2 =

    4     5     6

    1     2     3

(4)按指定维数翻转矩阵

函数  flipdim

格式  B = flipdim(A,dim)    % flipdim(A,1) = flipud(A),并且flipdim(A,2)=fliplr(A)。

例1-52

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

A =

     1     2     3

     4     5     6

>> B1=flipdim(A,1),B2=flipdim(A,2)

B1 =

    4     5     6

    1     2     3

B2 =

    3     2     1

    6     5     4

(5)复制和平铺矩阵

函数  repmat

格式  B = repmat(A,m,n)       %将矩阵A复制m×n块,即B由m×n块A平铺而成。

B = repmat(A,[m n])      %与上面一致

B = repmat(A,[m n p…])   %B由m×n×p×…个A块平铺而成

repmat(A,m,n)           %当A是一个数a时,该命令产生一个全由a组成的m×n矩阵。

例1-53

>> A=[1 2;5 6]

A =

     1     2

     5     6

>> B=repmat(A,3,4)

B =

     1     2       1     2       1     2       1     2

     5     6       5     6       5     6       5     6

     1     2       1     2       1     2       1     2

     5     6       5     6       5     6       5     6

     1     2       1     2       1     2       1     2

     5     6       5     6       5     6       5     6

5.矩阵的比较关系

矩阵的比较关系是针对于两个矩阵对应元素的,所以在使用关系运算时,首先应该保证两个矩阵的维数一致或其中一个矩阵为标量。关系运算是对两个矩阵的对应运算进行比较,若关系满足,则将结果矩阵中该位置元素置为1,否则置0。

MATLAB的各种比较关系运算有见表1-1。

表1-1

运算符

含义

运算符

含义

>

大于关系

<

大于关系

= =

等于关系

>=

大于或等于关系

<=

小于或等于关系

~ =

不等于关系

例1-54

>> A=[1 2 3 4;5 6 7 8];B=[0 2 1 4;0 7 7 2];

>> C1=A==B, C2=A>=B, C3=A~=B

C1 =

    0     1     0     1

    0     0     1     0

C2 =

    1     1     1     1

    1     0     1     1

C3 =

    1     0     1     0

    1     1     0     1

6.矩阵元素的数据变换

对于小数构成的矩阵A来说,如果我们想对它取整数,有以下几种方法:

(1)按-∞方向取整

函数  floor

格式  floor(A)   %将A中元素按-∞方向取整,即取不足整数。

(2)按+∞方向取整

函数  ceil

格式  ceil(A)   %将A中元素按+∞方向取整,即取过剩整数。

(3)四舍五入取整

函数  round

格式  round (A)   %将A中元素按最近的整数取整,即四舍五入取整。

(4)按离0近的方向取整

函数  fix

格式  fix (A)   %将A中元素按离0近的方向取整

例1-55

>> A=-1.5+4*rand(3)

A =

   2.3005    0.4439    0.3259

  -0.5754    2.0652   -1.4260

   0.9274    1.5484    1.7856

>> B1=floor(A),B2=ceil(A),B3=round(A),B4=fix(A)

B1 =

    2     0     0

   -1     2    -2

    0     1     1

B2 =

    3     1     1

    0     3    -1

    1     2     2

B3 =

    2     0     0

   -1     2    -1

    1     2     2

B4 =

    2     0     0

    0     2    -1

    0     1     1

(5)矩阵的有理数形式

函数  rat

格式  [n,d]=rat (A)   %将A表示为两个整数矩阵相除,即A=n./d。

例1-56  对于上例中的A

>> [n,d]=rat(A)

n =

       444          95         131

       -225        2059        -472

       166          48         1491

d =

   193   214   402

   391   997   331

   179    31   835

(6)矩阵元素的余数

函数  rem

格式  C = rem (A, x)   %表示A矩阵除以模数x后的余数。若x=0,则定义rem(A, 0)=NaN,若x≠0,则整数部分由fix(A./x)表示,余数C=A-x.*fix (A./x)。允许模x为小数。

7.矩阵逻辑运算

设矩阵A和B都是m×n矩阵或其中之一为标量,在MATLAB中定义了如下的逻辑运算:

(1)矩阵的与运算

格式  A&B或and(A, B)

说明  A与B对应元素进行与运算,若两个数均非0,则结果元素的值为1,否则为0。

(2)或运算

格式  A|B或or(A, B)

说明  A与B对应元素进行或运算,若两个数均为0,则结果元素的值为0,否则为1。

(3)非运算

格式  ~A或not (A)

说明  若A的元素为0,则结果元素为1,否则为0。

(4)异或运算

格式  xor (A,B)

说明  A与B对应元素进行异或运算,若相应的两个数中一个为0,一个非0,则结果为0,否则为1。

例1-57

>> A=[0 2 3 4;1 3 5 0],B=[1 0 5 3;1 5 0 5]

A =

   0     2     3     4

     1     3     5     0

B =

     1     0     5     3

     1     5     0     5

>> C1=A&B,C2=A|B,C3=~A,C4=xor(A,B)

C1 =

    0     0     1     1

    1     1     0     0

C2 =

    1     1     1     1

    1     1     1     1

C3 =

    1     0     0     0

    0     0     0     1

C4 =

    1     1     0     0

    0     0     1     1

12 符号矩阵运算

1.符号矩阵的四则运算

Matlab 6.x 抛弃了在4.2版中为符号矩阵设计的复杂函数形式,把符号矩阵的四则运算简化为与数值矩阵完全相同的运算方式,其运算符为:加(+)、减(-)、乘(×)、除(/、\)等或:符号矩阵的和(symadd)、差(symsub)、乘 (symmul)。

例1-58  

>>

'

>>

>>C=B-A

>>D=a\b

则显示:

C=

x-1/x  1-1/(x+1)

x+2-1/(x+2)   -1/(x+3)

D=

-6*x-2*x^3-7*x^2     1/2*x^3+x+3/2*x^2

6+2*x^3+10*x^2+14*x   -2*x^2-3/2*x-1/2*x^3

2.其他基本运算

符号矩阵的其他一些基本运算包括转置(')、行列式(det)、逆(inv)、秩(rank)、幂(^)和指数(exp和expm)等都与数值矩阵相同

3.将数值矩阵转化为符号矩阵

函数  sym

格式  B=sym(A)   %将A转化为符号矩阵B

例1-59  

>> A=[2/3,sqrt(2),0.222;1.4,1/0.23,log(3)]

A =

   0.6667    1.4142    0.2220

   1.4000    4.3478    1.0986

>> B=sym(A)

B =

[  2/3,      sqrt(2),                     111/500]

[   7/5,     100/23,    4947709893870346*2^(-52)]

4.符号矩阵的索引与修改

符号矩阵的索引与修改同数值矩阵的索引与修改完全相同,即用矩阵的坐标括号表达式实现。

例1-60  对上例中的矩阵B

>> B(2,3)      %矩阵的索引

ans =

4947709893870346*2^(-52)

>> B(2,3)='log(7)'     %矩阵的修改

B =

[     2/3, sqrt(2), 111/500]

[     7/5,  100/23,  log(7)]

5.符号矩阵的简化

符号工具箱中提供了符号矩阵因式分解、展开、合并、简化及通分等符号操作函数。

(1)因式分解

函数  factor

格式  factor(s)    %符号表达式s的因式分解函数

说明  S为符号矩阵或符号表达式,常用于多项式的因式分解。

例1-61  将x 9-1分解因式

在Matlab命令窗口键入:

syms x

factor(x^9-1)

则显示:ans = 

(x-1)*(x^2+x+1)*(x6+x^3+1)

例1-62  问“入”取何值时,齐次方程组

有非0解?

解:在Matlab编辑器中建立M文件:

syms k

A=[1-k -2 4;2 3-k 1;1 1 1-k];

D=det(A)

factor(D)

其结果显示如下:

D =

-6*k+5*k^2-k^3

ans =

-k*(k-2)*(-3+k)

从而得到:当k=0、k=2或k=3时,原方程组有非0解。

(2)符号矩阵的展开

函数  expand  

格式:expand(s)   %符号表达式s的展开函数

说明:s为符号矩阵或表达式。常用在多项式的因式分解中,也常用于三角函数,指数函数和对数函数的展开中。

例1-63  将(x+1)3、sin(x+y)展开

在Matlab编辑器中建立M文件:

syms  x  y

p=expand((x+1)^3)

q=expand(sin(x+y))

则结果显示为

p =

    x^3+3*x^2+3*x+1

q =

sin(x)*cos(y)+cos(x)*sin(y)

(3)同类式合并

函数  Collect

格式  Collect(s,v)   %将s中的变量v的同幂项系数合并

Collect(s)    % s是矩阵或表达式,此命令对由命令findsym函数返回的默认变量进行同类项合并。

(4)符号简化

函数  simplesimplify   %寻找符号矩阵或符号表达式的最简型

格式  simple (s)          % s是矩阵或表达式

      [R,how]=simple (s)  %R为返回的最简形,how为简化过程中使用的主要方法。

说明  Simple(s)将表达式s的长度化到最短。若还想让表达式更加精美,可使用函数Pretty。

格式  Pretty(s)     %使表达式s更加精美

例1-64  计算行列式

的值。

在Matlab编辑器中建立M文件:

syms  a  b  c  d

A=[1 1 1 1;a b c d;a^2 b^2 c^2 d^2;a^4 b^4 c^4 d^4];

d1=det(A)

d2=simple(d1)     %化简表达式d1

pretty(d2)      %让表达式d2符合人们的书写习惯

则显示结果如下: 

d1 =

b*c^2*d^4-b*d^2*c^4-b^2*c*d^4+b^2*d*c^4+b^4*c*d^2-b^4*d*c^2-a*c^2*d^4+a*d^2*c^4+a*b^2*d^4-a*b^2*c^4-a*b^4*d^2+a*b^4*c^2+a^2*c*d^4-a^2*d*c^4-a^2*b*d^4+a^2*b*c^4+a^2*b^4*d-a^2*b^4*c-a^4*c*d^2+a^4*d*c^2+a^4*b*d^2-a^4*b*c^2-a^4*b^2*d+a^4*b^2*c

d2 =

(-d+c)*(b-d)*(b-c)*(-d+a)*(a-c)*(a-b)*(a+c+d+b)

(-d+c)(b-d)(b-c)(-d+a)(a-c)(a-b)(a+c+d+b)

13 矩阵元素个数的确定

函数  numel

格式  n = numel(a)    %计算矩阵A中元素的个数

例1-65

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

>> n=numel(A)

n =

     8

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!