MATLAB在电子信息工程中的应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 MATLAB常用语法

2.1 MATLAB的数值计算功能

MATLAB强大的数值计算功能使其在诸多数学计算软件中傲视群雄,是MATLAB软件的基础。本章将展开关于MATLAB数值计算功能的介绍。

2.1.1 MATLAB的数据类型

MATLAB的数据类型主要包括:数字、字符串、矩阵、单元型数据及结构型数据等。

1.变量与常量

变量是任何程序设计语言的基本要素之一,MATLAB语言当然也不例外。与常规的程序设计语言不同的是,MATLAB并不要求事先对所使用的变量进行声明,也不需要指定变量类型,MATLAB语言会自动依据所赋予变量的值或对变量所进行的操作来识别变量的类型。在赋值过程中如果赋值变量已存在,MATLAB语言将使用新值代替旧值,并以新值类型代替旧值类型。

在MATLAB语言中变量的命名应遵循如下规则:

(1)变量名区分大小写。

(2)变量名长度不超过31位,第31个字符之后的字符将被MATLAB语言所忽略。

(3)变量名以字母开头,可以由字母、数字、下画线组成,但不能使用标点。

与其他的程序设计语言相同,在MATLAB语言中也存在变量作用域的问题。在未加特殊说明的情况下,MATLAB语言将所识别的一切变量视为局部变量,即仅在其使用的M文件内有效。若要将变量定义为全局变量,则应当对变量进行说明,即在该变量前加关键字global。一般来说,全局变量均用大写的英文字符表示。

MATLAB语言本身也具有一定预定义的变量,这些特殊的变量称为常量。表2-1 列出了MATLAB语言中经常使用的一些常量值。

表2-1 常用的一些常量值

在MATLAB语言中,定义变量时应避免与常量名重复,以防改变这些常量的值,如果已改变了某些常量的值,可以通过“clear+常量名”命令恢复该常量的初始设定值(当然也可通过重新启动MATLAB系统来恢复这些常量值)。

2.数字变量的运算及显示格式

MATLAB是以矩阵为基本运算单元的,而构成数值矩阵的基本单元是数字。为了更好地学习和掌握矩阵的运算,首先对数字的基本知识作简单的介绍。

对于简单的数字运算,可以直接在命令窗口中以平常惯用的形式输入,如计算2和4的乘积再减3时,可以直接输入

      >> 2*4-3
      ans =
          5

这里“ans”是指当前的计算结果,若计算时用户没有对表达式设定变量,系统就自动赋当前结果给“ans”变量。用户也可以输入

      >> x=2*4-3
      x=
          5

此时系统就把计算结果赋给指定的变量x了。

MATLAB语言中数值有多种显示形式,在默认情况下,若数据为整数,则就以整数表示;若数据为实数,则以保留小数点后4位的精度近似表示。MATLAB语言提供了10种数据显示格式,常用的有下述几种格式:

short:小数点后4位(系统默认值)。

long:小数点后14位。

short e:5位指数形式。

long e:15位指数形式。

MATLAB语言还提供了复数的表达和运算功能。在MATLAB语言中,复数的基本单位表示为i或j。在表达简单数数值时虚部的数值与i、j之间可以不使用乘号,但是如果是表达式,则必须使用乘号以识别虚部符号。

3.字符串

字符和字符串运算是各种高级语言必不可少的部分,MATLAB中的字符串是其进行符号运算表达式的基本构成单元。

在MATLAB中,字符串和字符数组其本上是等价的,所有的字符串都用单引号进行输入或赋值(当然也可以用函数char来生成)。字符串的每个字符(包括空格)都是字符数组的一个元素。

【例2-1】字符串示例。

      >> x=' Hello word' ;
      >> x
      x=
      Hello word
      >> size(x) %查看数组的维数
      ans =
          1   10

另外,由于MATLAB对字符串的操作与C语言几乎相同,在此不再展开介绍。

2.1.2 矩阵基础

1.简单矩阵的输入

在MATLAB语言中,矩阵与数组的输入形式和书写方法是相同的,其区别在于进行运算时,数组的运算是数组中对应元素的运算,而矩阵运算则应符合矩阵运算的规则。在数值运算中使用的矩阵必须赋值,矩阵的简单输入可以采用直接赋值和增量赋值两种方法。

1)直接赋值法

元素较少的简单矩阵可以在MATLAB命令窗口中以命令行的方式直接输入。矩阵的输入必须以方括号“[ ]”作为其开始与结束标志,矩阵的行与行之间要用分号“; ”或按【Enter】键分开,矩阵的元素之间用逗号“, ”或用空格分隔。矩阵的大小可以不必预先定义,且矩阵元素的值可以用表达式表示。

【例2-2】矩阵输入示例。

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

MATLAB语言的变量名称字符区分大小写,字符S与s分别为独立的矩阵变量名。在MATLAB语言命令行的最后如果加上分号“; ”,则在命令窗口中不会显示输入命令所得到的结果。

2)增量赋值法

矩阵的输入可以使用MATLAB语言具有向量增量功能的增量赋值法,增量赋值法的标准格式如下:

      S=初值:增量:终值

其中,“:”为分隔识别符。

【例2-3】增量赋值法示例。

      >> S=0.5:0.5:2
      S=
          0.5000   1.0000   1.5000   2.0000
      >> Z=[S;3*S; S/5]
      Z=
          0.5000   1.0000   1.5000   2.0000
          1.5000   3.0000   4.5000   6.0000
          0.1000   0.2000   0.3000   0.4000

增量赋值法对于系统仿真是非常有用的。增量赋值法的标准格式中如果增量项为默认值,则默认增量值为1,即表示S=初值:终值。

2.矩阵的元素

矩阵是由多个元素组成的,矩阵的元素由下标来标识。

1)矩阵的下标

(1)全下标标识。矩阵中的元素可以用全下标来标识,即用矩阵的行下标和列下标来表示矩阵的元素。一个m×n的矩阵A的第i行、第j列的元素表示为a(i, j)。这种全下标标识方法的优点是几何概念清楚,表述简单。它在MATLAB语言的寻访和赋值中最为常用。

如果在提取矩阵的元素时,矩阵元素的下标行或列(i, j)大于矩阵的大小m×n,则MATLAB会提示出错;而在对矩阵元素赋值时,如果行或列下标数值(i, j)超出矩阵的维数m×n,则MATLAB会自动扩充矩阵,扩充部分未被赋值的元素值以0填充。

【例2-4】用全下标标识给矩阵元素赋值。

      >> A=[1 3 4;2 8 9]
      A=
          1    3    4
          2    8    9
      >>A(3,3)  %提取A(3,3)的值
      ?? ? Attempted to access A(3,3); index out of bounds because size(A)=[2,3].
      >>A(3,3)=7  %给A(3,3)赋值
      A=
          1    3    4
          2    8    9
          0    0    7

MATLAB语言规定在百分比符号“%”之后的文字内容为程序或命令行的注释。

(2)单下标标识。矩阵的元素也可以用单下标来标识,就是先把矩阵的全部元素按先左后右的次序连接成“一维长列”,然后对元素位置进行编号。一个m×n的矩阵A的第i行第j列的元素a(i, j)对应的单下标表示为a(s),其中s=(j-1)×m+i

2)子矩阵块的产生

MATLAB利用矩阵的下标可以产生子矩阵。对于a(i, j),如果ij是向量而不是标量,则将获得指定矩阵的子矩阵块。子矩阵是从对应矩阵中取出一部分元素来构成,可以分别用全下标和单下标两种方法来产生子矩阵。

【例2-5】用全下标标识和单下标方法产生子矩阵。

      >> S=[1 3 5;2 6 8;3 7 4]
      S=
          1    3    5
          2    6    8
          3    7    4
      >> S([1 3], [1 2]) %取行数为1,3,列数为1,2的元素构成子矩阵
      ans =
          1    3
          3    7
      >> S(1:3,2:3) %取行数为1~3,列数为2~3的元素构成子矩阵
      ans =
          3    5
          6    8
          7    4
      >>S(:,3)  %取所有的行数,列数为3的元素构成子矩阵
      ans =
          5
          8
          4
      >>S(end,1:3)  %取行数为3,列数为1~2的元素构成子矩阵,用end表示某一维阶数中
                  %的最大值
      ans =
          3    7    4
      >>S([14;25])  %取单下标为1,4,2,5的元素构成子矩阵
      ans =
          1    3
          2    6

3)矩o阵元素的赋值

对矩阵的元素进行赋值有三种方法:单下标方式、全下标方式和全元素方式。

(1)单下标方式。S(s)=b表示给矩阵S的部分元素赋值,其中向量b的元素个数必须等于矩阵S需要赋值的这一部分元素的个数。

【例2-6】用单下标方式给矩阵元素赋值。

    >> S(5:6)=[9 9] %给第5、6个元素赋值为9
    S=
        1    3    5
        2    9    8
        3    9    4

(2)全下标方式。S(i, j)=B表示给矩阵S的部分元素赋值,其中矩阵B的行列数必须等于矩阵S需要赋值的这一部分行列数。

【例2-7】用全下标方式给矩阵元素赋值。

    >>S(1:2,1:3)=[222;333]  %给第1行元素赋值为2,第2行元素赋值为3
    S=
        2    2    2
        3    3    3
        3    9    4

(3)全元素方式。S(:)=B表示给矩阵S的所有元素赋值,其中矩阵B的元素总数必须等于矩阵S的元素总数,但行列数可以不相等。

【例2-8】用全元素方式给矩阵元素赋值。

    >> S=[1 4;2 5;3 6]
    S=
        1    4
        2    5
        3    6
    >> B=[1 2 3;4 5 6]
    B=
        1    2    3
        4    5    6
    >>S(:)=B  %按全元素方式给矩阵A赋值
    S=
        1    5
        4    3
        2    6

3.变量和语句

如同其他计算机高级语言一样,MATLAB语言也会有变量命名规则。MATLAB变量名区分字母大小写。变量名不超过31个字符,第31个字符以后的字符将被忽略,且字符之间不能有空格。变量名必须以字母开头,之后可以是任意字母、数字或下画线。许多标点符号在MATLAB语言中有特殊的含义,所以变量名不允许使用标点符号。

MATLAB语言采用命令行形式的表达式语言,每一条命令行就是一条语句,其格式与书写数学表达式相近,容易掌握。在MATLAB语言命令窗口输入语句,该语句就被MATLAB系统解释运行并给出运行结果。如果一条语句的表达式太长,可用三个句点“…”将其延伸到下一行。MATLAB的语句可以采用表达式和赋值语句两种形式。

1)表达式由变量名、常数、函数和运算符号构成

表达式执行运算后产生的结果,将自动赋给名为ans的默认变量,即表示MATLAB运算后的结果,并将其结果在屏幕上显示出来。变量ans的值将在下一条表达式语句执行后被刷新。

【例2-9】表达式语句。

      >> sqrt(4)*exp(-1*5)
      ans =
          0.0135
      >> 9*5+5/7
      ans =
        45.7143

2)赋值语句的形式

    变量=表达式

赋值语句经过执行后是将其右边表达式计算产生的结果,赋值给赋值语句中等号左边的变量,并存入内存。MATLAB可同时执行以逗号“, ”或分号“; ”隔开的多个赋值语句。

【例2-10】赋值语句示例。

      >> x=6+7-5/8+6*2
      x=
        24.3750
      >>t=cos(pi/7); y=x^2, z=5*y  %同时执行多个赋值语句
      y=
        594.1406
      z=
        2.9707e+003

4.who命令和永久变量

1)who命令

在命令窗口中执行的命令和运行M文件所产生的变量信息全部存放在当前工作空间中,在命令窗口输入“who”命令可以对MATLAB的变量名进行查询;输入whos命令可以对MATLAB的变量及其属性进行查询。

【例2-11】who及whos命令示例。

      >> x=[4 5 7;3 5 8;0 1 2];
      >> y=[1 4 5 6];
      >> z=[1;3;5;7;9];
      >> s=' MATLAB is very Strong! ' ;
      >>who  %用who命令对变量名进行查询
      Your variables are:
      s  x  y  z
      >>whos  %用whos命令对变量及其属性进行查询
        Name     Size          Bytes   Class    Attributes
        s        1×22             44    char
        x        3×3              72   double
        y        1×4              32   double
        z        5×1              40   double

查询结果表示x、y和z为双精度数值变量,而s为字符变量。

2)永久变量

为了一些特殊情况下的运算,MATLAB语言预先定义了一些永久变量,如表2-2所示。对于MATLAB语言的永久变量,需要注意以下5点。

表2-2 永久变量

(1)永久变量不能用clear命令清除,所以称为永久变量。

(2)永久变量不响应who, whos命令。

(3)永久变量的变量名如果没有被赋值,那么永久变量将取表2-2中所给定的值。

(4)如果对任何一个永久变量进行赋值,则那个变量的默认值将被所赋的值临时覆盖。如果使用“clear”命令清除MATLAB内存中的变量,或者MATLAB的命令窗口被关闭后重新启动,不管永久变量曾经被赋值与否,所有的永久变量将被重新设置为默认值。

(5)在遵循IEEE算法规则的计算机上,被0除是允许的。它不会导致程序执行的中断,系统会给出警告信息,且用一个特殊的名称(如Inf, NaN)记述。

5.数字和算术表达式

对于简单的数字运算,可以直接用表达式语句和赋值语句的形式在MATLAB命令窗口输入。

MATLAB语言的算术运算符可以按优先级由低到高分为五级,每一级的优先级相同,运算时从左向右进行结合。各优先级所包含的运算符分别为:

(1)转置符“.”、幂符“.^”、复共轭转置“' ”、矩阵幂符“^”。

(2)标量加“+”、标量减“-”。

(3)数组乘法“.*”、数组右除“./”、数组左除“.\”、矩阵乘法“*”、矩阵右除“/”、矩阵左除“\”。

(4)加法“+”、减法“-”。

(5)冒号运算符“:”。

大多数算术运算符只是对具有相同维数数组的对应元素进行运算。对于矩阵或向量,算术运算符连接的两个运算对象必须同维数或者两个中有一个是标量。当一个运算对象是标量时,运算符将把标量和另一个运算对象的每一个元素进行相应运算。如果要改变运算的优先级,可以用括号强制实现。

6.复数和矩阵

MATLAB语言对于复数的处理,不像其他程序语言那样把复数的实部与虚部分开处理,而是把复数作为一个整体处理。虚数单位用自定义变量ij表示。MATLAB语言的矩阵元素允许是复数、复变量和由它们组成的表达式。MATLAB语言利用其内部函数可以对复数的直角坐标表示和极坐标表示之间进行转换,复数z的直角坐标表示z=a+bi和极坐标表示z=re之间转换的指令如表2-3所示。

表2-3 复数的直角坐标表示与极坐标表示之间的转换

【例2-12】复数z1=4+5i, z2=2-4i,的输入及计算

1)数学直接式的直角坐标表示法

      >> z1=4+5i
      z1 =
        4.0000 + 5.0000i

在这种格式中,5i是一个完整的虚数,在5和i之间不允许有空格存在。这种书写格式只适用于数值标量复数,而不适用于数值矩阵。为避免出错,尽量不要使用这种输入格式。

2)采用运算符构成的直角坐标表示和极坐标表示法

      >>z2=2-4i                          %由运算符构成的直角坐标表示
      z2 =
        2.0000-4.0000i
      >>z3=3*exp(i*pi/6)                  %由运算符构成的极坐标表示
      z3 =
        2.5981 + 1.5000i
      >> z=z1*z2/z3
      z=
        7.0829-6.3987i

【例2-13】复数矩阵的生成及运算示例。

      >>S=[17;39]+[58;43]*i                %复数矩阵的输入
      S=
        1.0000+5.0000i   7.0000+8.0000i
        3.0000+4.0000i   9.0000+3.0000i
      >>B=[1-3i 2+4i;4-2i 9+8i]              %复数矩阵的输入
      B=
        1.0000-3.0000i   2.0000+4.0000i
        4.0000-2.0000i   9.0000+8.0000i
      >> C=S/B
      C=
        -1.8880-1.3840i   1.3360+0.8480i
        -2.2760-0.2680i   1.4720+0.0960i
      >>C_real=real(C)                      %求复数矩阵C的实部
      C_real =
        -1.8880   1.3360
        -2.2760   1.4720
      >>C_imag=imag(C)                     %求复数矩阵C的虚部
      C_imag =
        -1.3840   0.8480
        -0.2680   0.0960
      >>C_m=abs(C)                         %求复数矩阵C的模
      C_m =
          2.3409   1.5824
          2.2917   1.4751
      >>C_ph=angle(C)*180/pi                %求复数矩阵C以度为单位的相角
      C_ph =
       -143.7567   32.4045
       -173.2843   3.7314

7.输入格式

MATLAB语句执行的结果可以在计算机屏幕上显示,并同时赋值给指定名称的变量。如果没有指定的变量名称,则赋值给永久变量名“ans”, MATLAB数据输出显示格式可以由format命令来执行。format命令只影响结果的显示,不影响结果的计算与存储精度。MATLAB语言总是以双精度执行所有的运算。

MATLAB显示数据结果时,遵循一定的规则。在默认的情况下,当执行结果为整数时,MATLAB将它作为整数显示;当执行结果是一般实数时,MATLAB以小数点后4位小数的精度近似显示结果。如果结果中的有效数字超出了这一范围,MATLAB以类似于科学计算器的科学记数法来显示结果。用户可以通过MATLAB语言File菜单中的Preference选项来设置数值的输入格式,当选定了某种输出格式后,则所有的结果都采用这种格式输出,除非用format命令重新特别定义。表2-4给出了以π值为例MATLAB语言的数值输e出格式,其中format short g显示格式是MATLAB默认时的默认显示格式,表中所有格式设置的实现仅在MATLAB当前执行过程中有效。

表2-4 数值输出格式

8.help功能

MATLAB语言提供了快速的命令窗口查询帮助功能,这些帮助命令有lookfor命令、help帮助系统和其他常用帮助命令。

1)help帮助系统

help系列的帮助命令有help和help+函数(类)名两种形式。

(1)help命令。help命令是最为常用的命令,在MATLAB的命令窗口直接输入help命令将会显示当前的帮助系统中所包含的全部项目,即搜索路径中所有的目录名称。

【例2-14】help命令示例。

      >>help   %在命令窗口直接输入help命令,显示在线帮助浏览
      HELP topics:
      matlab\general                -General purpose commands.
      matlab\ops                   -Operators and special characters.
      matlab\lang                  -Programming language constructs.
      matlab\elmat                 -Elementary matrices and matrix manipulation.
      matlab\elfun                 -Elementary math functions.
      matlab\specfun               -Specialized math functions.
      matlab\matfun                -Matrix functions-numerical linear algebra.
      matlab\datafun               -Data analysis and Fourier transforms.
      matlab\polyfun               -Interpolation and polynomials.
      matlab\funfun                -Function functions and ODE solvers.
      matlab\sparfun               -Sparse matrices.
      ……

(2)help+函数(类)名。在MATLAB的实际应用中,这是最有效的一个帮助命令,通过对具体函数功能的查询可以帮助用户对MATLAB语言进行深入学习。

【例2-15】help+函数(类)名示例。

      >>help matfun  %help+函数(类)名
        Matrix functions - numerical linear algebra.
         Matrix analysis.
          norm    -Matrix or vector norm.
          normest       -Estimate the matrix 2-norm.
      ……
      Linear equations.
          /and/        -Linear equation solution; use"help slash".
          linsolve      -Linear equation solution with extra control.
      ……
      Eigenvalues and singular values.
          eig          -Eigenvalues and eigenvectors.
          svd          -Singular value decomposition.
      ……
      Matrix functions.
          expm         -Matrix exponential.
      ……
      Factorization utilities
          qrdelete      -Delete a column or row from QR factorization.
      ……
      >>help inv                 %help+函数名
       INV   Matrix inverse.
          INV(X) is the inverse of the square matrix X.
          A warning message is printed if X is badly scaled or
          nearly singular.
          See also slash, pinv, cond, condest, lsqnonneg, lscov.
          Overloaded methods:
            gf/inv
            lti/inv
            sym/inv
            uss/inv
            umat/inv
            ufrd/inv
            ndlft/inv
            atom/inv
            idmodel/inv
          Reference page in Help browser
            doc inv

2)lookfor

在知道某个MATLAB函数名的情况下,使用help命令可以快速准确地查找此函数的确切用法。然而,如果要查询一个不知其函数名称的函数用法与功能时,help命令则不能满足要求。此时,可以用lookfor命令根据相关的关键字来查询相关的函数。lookfor命令的查询是对MATLAB语言搜索路径中的每个M文件注释区的第一行进行扫描,一旦发现此行中有所要查询的关键字,则将该函数名及第一行注释内容显示在屏幕上。因此,用户在自己编写的文件中也可以加入在线注释便于查询。

【例2-16】lookfor命令示例。

      >> lookfor transfer
      tf               -Creation of transfer functions or conversion to transfer function.
      ss2tf        -State-space to transfer function conversion.
      tf2ss        -Transfer function to state-space conversion.
      ……
      bodeplot         -Plots the Bode diagram of a transfer function or spectrum.
      th2tf        -Transforms from the THETA-format to transfer functions.

3)其他帮助命令

在MATLAB语言中,还有一些经常被用到具有特别查询功能的查询,帮助命令如表2-5所示。

表2-5 其他帮助命令

9.退出MATLAB以及工作空间的存储

1)退出MATLAB

如果想要退出MATLAB运行环境,可以使用下面4种方式中的任何一种:

(1)在MATLAB的命令窗口中输入“exit”命令。

(2)在MATLAB的命令窗口中输入“quit”命令。

(3)直接单击MATLAB命令窗口右上角的关闭按钮。

(4)从MATLAB环境的File菜单中退出。

2)工作空间的存储

工作空间是由MATLAB系统所提供的永久变量,以及用户使用过程中生成的所有变量组成的一个概念空间。当MATLAB启动后,系统会自动建立一个工作空间,这时的工作空间仅包含MATLAB的一些永久变量,随着用户使用MATLAB语言求解问题的进行,系统会逐渐增加一些用户自己定义的变量,这些用户自己定义的变量会一直保存下去,直到关闭MATLAB系统释放工作空间后才会消失。在没有退出MATLAB环境时,要想删除这些内存变量,可以在MATLAB命令窗口输入“clear”命令。

在MATLAB系统工作空间中保存变量会因关闭系统而被自动释放掉,当再次打开MATLAB系统时,用户以前定义并使用过的变量已经不存在。在进行科学计算时,经常需要将没有处理完的一些数据保存起来,以备下一次继续使用,即要求将MATLAB工作空间中的变量进行存储。MATLAB工作空间的存储可以通过执行“File”→“Save Workspace As”菜单命令来实现。

2.1.3 矩阵运算

矩阵运算是MATLAB语言最基本的重要运算功能,MATLAB对于矩阵运算的处理与线性代数中的方法相同。在线性代数中矩阵的加、减及乘均有定义,而除没有定义。MATLAB为了便于计算,专门定义了矩阵的除法并且定义了矩阵的左除和右除。MATLAB定义矩阵除法和线性代数中乘以矩阵的逆意义近似。

1.矩阵转置

MATLAB语言求矩阵A的转置直接用A′来表示。如果Am×n的矩阵,则A′就是n×m的矩阵。如果A是复数矩阵,那么A′就表示复数矩阵的共轭转置。如果只想得到复数矩阵A的转置可以使用A′命令来完成,此时所得到的结果与conj(A′)的结果相同。当A为实数矩阵时,有A′=A.′。

【例2-17】矩阵的转置示例。

      >> A=[3 5 9;2 6 8]
      A=
          3    5    9
          2    6    8
      >> A1=A'
      A1 =
          3    2
          5    6
          9    8
      >> A2=A.'
      A2 =
          3    2
          5    6
          9    8
      >> B=[-2-i 4+5i;5-7i 9+2i]
      B=
        -2.0000-1.0000i   4.0000+5.0000i
         5.0000-7.0000i   9.0000+2.0000i
      >> B1=B'
      B1 =
        -2.0000+1.0000i   5.0000+7.0000i
         4.0000-5.0000i   9.0000-2.0000i
      >> B2=B.'
      B2 =
        -2.0000-1.0000i   5.0000-7.0000i
         4.0000+5.0000i  9.0000+2.0000i
      >> B3=conj(B' )
      B3 =
        -2.0000-1.0000i   5.0000-7.0000i
         4.0000+5.0000i  9.0000+2.0000i

2.矩阵的加法和减法

MATLAB语言能对具有相同阶数的两个矩阵或者一个标量和一个矩阵进行加法与减法运算,其运算符号分别是“+”和“-”。两个矩阵的加法和减法是对应元素的加减,而矩阵与标量的加法和减法运算则是矩阵中每一个元素都与标量进行加减运算。

【例2-18】矩阵的加减法示例。

      >> A=[4 5 6;7 8 9;11 2 34]
      A=
          4    5    6
          7    8    9
          11    2   34
      >> B=[3 4 5;6 8 0;112 3 4]
      B=
          3    4    5
          6    8    0
        112    3    4
      >> C=A+B
      C=
          7    9   11
          13   16    9
         123    5   38
      >> C=A-B
      C=
          1    1    1
          1    0    9
        -101   -1   30
      >>D=C+10   %矩阵与标量相加
      D=
          11   11   11
          11   10   19
         -91    9   40

3.矩阵的乘法

MATLAB语言的矩阵乘法运算有标量与矩阵相乘和矩阵与矩阵相乘两种方式,乘法所使用的运算符是“*”。标量与矩阵的乘法运算是标量与矩阵中的每一个元素进行相乘的运算;而矩阵与矩阵的乘法则按照线性代数中矩阵的乘法规则进行,即两个矩阵要相乘,只有当前一个矩阵的列数和后一个矩阵的行数相同时才能进行。

【例2-19】矩阵的乘法示例。

      >> A=[-1-2-3-4;15 6 8 3; -4-7-9-5;1 4 7 9]
      A=
          -1   -2   -3   -4
          15    6    8    3
          -4   -7   -9   -5
           1    4    7    9
      >>B=fliplr(A)  %矩阵B由矩阵A左右翻转得到
      B=
          -4   -3   -2   -1
           3    8    6   15
          -5   -9   -7   -4
           9    7    4    1
      >> C=B*A
      C=
        -34    0   -1    8
        108   60   106   117
        -106   -11   -22   -8
          81    0    0   -26
      >>D=A*B  %乘积AB与BA不一定相等
      D=
         -23   -14   -5   -21
         -55   -48   -38   46
          -5    2    9   -70
          54   29    9   40
      >> E=[1 3;5 9;7 1;2 8]
      E=
          1    3
          5    9
          7    1
          2    8
      >> F=D*E
      F=
        -170  -368
        -469  -267
         -72  -548
         342   752
      >>G=F*D  %不满足矩阵相乘的条件,系统会警告出错
      ?? ? Error using ==> mtimes
      Inner matrix dimensions must agree.

4.矩阵的除法

矩阵的除法有两种形式,即左除(用运算符“\”)和右除(用运算符“/”)。

1)矩阵的左除

对于矩阵AB来说,A\B表示矩阵A左除矩阵B,其计算结果与矩阵A的逆和矩阵B相乘的结果相似。其实,A\B是方程Ax=B的解,当方程是欠定或超定情况时,A\B所对应的是方程的最小二乘解。

【例2-20】矩阵的左除示例。

      >>  A=[1127;385;436]
      A=
          1   12    7
          3    8    5
          4    3    6
      >> B=[4;9;13]
      B=
          4
          9
          13
      >> C=[A;1 1 1]
      C=
          1   12    7
          3    8    5
          4    3    6
          1    1    1
      >> D=[B;5]
      D=
          4
          9
         13
          5
      >>x1=A\B  %求解欠定方程
      x1 =
         2.6442
        -0.1731
         0.4904
      >>x2=C\D  %求解超定方程
      x2 =
         2.9536
        -0.0847
         0.2639

2)矩阵的右除

对于矩阵AB来说,A/B表示矩阵A右除矩阵B,其计算结果与矩阵A和矩阵B的逆相乘的结果相似。矩阵A/B可以看成是方程xB=A的解。

【例2-21】矩阵的右除示例。

      >> A=[1 12 7;3 8 5;4 3 6]
      A=
          1   12    7
          3    8    5
          4    3    6
      >>B=flipud(A)  %矩阵B由矩阵A上下翻转得到
      B=
          4    3    6
          3    8    5
          1   12    7
      >> C=A/B
      C=
          0    0    1
          0    1    0
          1    0    0

5.矩阵的乘方

MATLAB语言计算矩阵乘方的表达形式为A^P,根据矩阵AP的不同具体对象,矩阵的乘方有不同的含义。

(1)如果矩阵A为方阵,P为大于1的整数,则矩阵的乘方所得到的结果是矩阵A的连乘P次;如果P不是整数,则矩阵的乘方是计算矩阵A的各特征值和特征向量的乘方。

(2)如果A为整数而P为方阵,则计算A^P时,其结果也由特征值和特征向量计算得到。

(3)如果AP都为方阵,或者AP两个矩阵中有一个不是方阵,则MATLAB语言会给出运算出错的信息。

【例2-22】矩阵的乘方示例。

      >> A=[12 22;32 42]
      A=
          12   22
          32   42
      >> B=[2 4 6;3 5 9]
      B=
          2    4    6
          3    5    9
      >> C1=A^2
      C1 =
              848       1188
            1728       2468
      >> C2=A*A
      C2 =
              848       1188
            1728       2468
      >> C3=A^0.4
      C3 =
        1.6635+1.1684i   1.6411-0.5652i
        2.3870-0.8221i   3.9013+0.3977i
      >> C4=1.6^A
      C4 =
        1.0e+011*
          1.3723   1.9503
          2.8368   4.0317
      >> C5=B^2
      ?? ? Error using ==> mpower
      Matrix must be square.

由计算的结果C1和C2可知,对于方阵A来说,A^2和A*A运算的结果一样,都是计算矩阵A的平方。同时还可以看出,当矩阵B不是方阵时,无法对它进行乘方运算。

6.矩阵的超越函数

MATLAB语言中的exp、sqrt和log等函数命令也可以作用到矩阵上,但这种运算只是定义在矩阵的单个元素上,即分别对矩阵的每一个元素进行相应的运算。在超越数学函数的后面加上字母m从而构成矩阵的超越函数,expm、sqrtm和logm分别为矩阵指数、矩阵开方和矩阵对数。矩阵的超越函数要求运算的矩阵必须为方阵。矩阵的超越函数也可以用一般的形式表示,如矩阵的指数用funm(A, ' exp' )函数命令可以实现,但它们所采用的算法不同,其计算结果会有微小的差异。

1)矩阵的指数运算

矩阵的指数运算常用的命令是expm,还有其他形式的命令,如expm1、expm2和expm3。其中,expm1是由Pade近似计算矩阵指数,expm2是由Taylor级数计算矩阵指数(其中expm2与expm3输入数据要为double),而expm3是由特征值计算矩阵的指数。expm命令形式使用的方法与expm1相同。

【例2-23】矩阵的指数运算示例。

      >>a=magic(2)  %生成二维魔方矩阵
      a=
          1    3
          4    2
      >> expm(a)
      ans =
        63.6830   63.5476
        84.7302   84.8655
      >> expm1(a)
      ans =
          1.7183   19.0855
        53.5982   6.3891
      >>expm2(a)   %输入数据类型不是double,出错显示
      ?? ? Undefined function or method ' expm2' for input arguments of type ' double' .
      >> expm3(a)
      ?? ? Undefined function or method ' expm3' for input arguments of type ' double' .
      >> funm(a, ' exp' )
      ans =
        63.6830   63.5476
        84.7302   84.8655

2)矩阵的对数运算

矩阵的对数运算由函数命令“logm”来实现。

【例2-24】矩阵的对数运算示例。

      >>A=rand(2)  %随机二维矩阵
      A=
          0.8147   0.1270
          0.9058   0.9134
      >> logm(A)
      ans =
        -0.2921   0.1555
          1.1091   -0.1713
      >> funm(A, ' log' )
      ans =
        -0.2921   0.1555
          1.1091   -0.1713

3)矩阵的开方运算

矩阵的开方运算由函数命令“sqrtm”来实现。

【例2-25】矩阵的开方运算示例。

      >> a=magic(2)
      a=
          1    3
          4    2
      >> sqrtm(a)
      ans =
        0.9583+0.8081i   0.9583-0.6061i
        1.2778-0.8081i   1.2778+0.6061i
      >>funm(a, ' sqrt' )  %此格式求开方在MATLAB是错误的
      ?? ? Error using ==> sqrt
      Too many input arguments.

2.1.4 数组运算

数组和矩阵在数学上是两个不同的概念。在MATLAB语言中,数组和矩阵在表达形式上有许多一致之处,但它们实际上遵循不同的运算规则。两者的运算容易混淆,从而导致语法错误,使程序无法运行;更为严重的是混淆数组与矩阵的运算会导致隐蔽性的错误,程序能够运行,但毫无疑问其运行的结果是错误的。在MATLAB语言中,数组的运算符是在相应的矩阵运算符前加一个“.”。两个数组必须具有相同的维数才能进行数组运算。

1.数组的加法和减法运算

数组的加法和减法运算与矩阵的加法和减法运算规则相同,即对应的元素之间的相加和相减。同矩阵的加、减法运算一样,数组的加法和减法分别采用运算符“+”和“-”。

【例2-26】数组的加法和减法示例。

      >> x=[5 6 7 8];
      >> y=[1 3 5 7];
      >> a=x+y
      a=
          6    9   12   15
      >> b=x-y
      b=
          4    3    2    1
      >> c=x+5
      c=
          10   11   12   13

2.数组的乘法和除法

MATLAB中数组的乘法和除法是数组对应元素之间的乘法和除法,采用的运算符号分别是“.*”和“./”或“.\”。

【例2-27】数组的乘法和除法示例。

      >> x=[1 4 5 7;2 5 8 12;3 6 9 10]
      x=
          1    4    5    7
          2    5    8   12
          3    6    9   10
      >> y=fliplr(x)
      y=
          7    5    4    1
          12    8    5    2
          10    9    6    3
      >> a1=x.*y
      a1 =
          7   20   20    7
          24   40   40   24
          30   54   54   30
      >>a2=x.*2
      a2=
           2    8   10   14
           4   10   16   24
           6   12   18   20
      >>a3=x./y
      a3=
          0.1429   0.8000   1.2500   7.0000
          0.1667   0.6250   1.6000   6.0000
          0.3000   0.6667   1.5000   3.3333
      >>a4=x.\y
      a4=
          7.0000   1.2500   0.8000   0.1429
          6.0000   1.6000   0.6250   0.1667
          3.3333   1.5000   0.6667   0.3000

对于数组x和y, “x ./y”和“x .\y”的结果不同,前者表示在进行除法运算时,数组x相应的元素作为被除数,而后者表示在进行除法运算时,数组x相应的元素作为除数。

3.数组的乘方运算

MATLAB语言中数组的乘方运算采用的运算符号为“.^”。数组的乘方根据其底数与指数的不同,可以分为3种情况。

(1)两个数组之间的乘方运算。乘方运算的底数和指数都是数组。

(2)一个数组的某个具体标量数值的乘方。乘方运算的底数为一个数组,而指数为一个标量的数值。

(3)一个标量数值的某个具体数组的乘方。乘方运算的底数为一个标量数值,而指数为一个数组。

【例2-28】数组的乘方运算示例。

      >> x=[1 4 7 9]
      x=
          1    4    7    9
      >> y=[3 6 8 2]
      y=
          3    6    8    2
      >>a=x.^y   %指数与底数均为数组
      a=
                1       4096    5764801         81
      >>b=x.^3   %底数为数组
      b=
          1   64   343   729
      >>c=5.^y  %指数为数组
      c=
              125      15625     390625         25

4.关系运算

在MATLAB语言中,可以通过关系运算符很方便地实现数组的关系运算。所有的关系运算都是按照数组的运算规则定义的,即数组与数组之间进行关系运算,实际上是它们对应的元素之间进行运算。MATLAB提供的用于两个量之间进行比较的关系运算符如表2-6所示。在关系运算中,当关系成立时结果为1(真),不成立时结果为0(假)。

表2-6 关系运算符

【例2-29】数组的关系运算示例。

      >> 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
      >>b=mod(a,5)  %mod为MATLAB的模求余函数
      b=
          2    4    1    3    0
          3    0    2    4    1
          4    1    3    0    2
          0    2    4    1    3
          1    3    0    2    4
      >>c=(rem(a,5)<=1)  %rem为MATLAB的求余函数
      c=
          0    0    1    0    1
          0    1    0    0    1
          0    1    0    1    0
          1    0    0    1    0
          1    0    1    0    0
      >> d=(rem(a,5)==1)
      d=
          0    0    1    0    0
          0    0    0    0    1
          0    1    0    0    0
          0    0    0    1    0
          1    0    0    0    0
      >> e=(mod(a,5)>=1)
      e=
          1    1    1    1    0
          1    0    1    1    1
          1    1    1    0    1
          0    1    1    1    1
          1    1    0    1    1

5.逻辑运算

逻辑运算也是对数组元素的运算。MATLAB语言提供的逻辑运算符有3个,“逻辑与”(“&”); “逻辑或”(“|”); “逻辑非”(“-”)。

【例2-30】数组的逻辑运算示例。

      >> x=magic(4)
      x=
          16    2    3   13
          5   11   10    8
          9    7    6   12
          4   14   15    1
      >> y=mod(x,4)
      y=
          0    2    3    1
          1    3    2    0
          1    3    2    0
          0    2    3    1
      >> a=x&y
      a=
          0    1    1    1
          1    1    1    0
          1    1    1    0
          0    1    1    1
      >> b=x—y
      b=
          1    1    1    1
          1    1    1    1
          1    1    1    1
          1    1    1    1
      >> c=-y
      c=
          1    0    0    0
          0    0    0    1
          0    0    0    1
          1    0    0    0

在MATLAB语言中,关系运算和逻辑运算可以用来生成0-1矩阵。MATLAB语言除了提供关系运算符和逻辑运算符之外,还提供了一些数组逻辑关系函数。MATLAB的数组逻辑关系函数及其含义如表2-7所示。

表2-7 MATLAB数组逻辑关系函数及其含义

6.基于初等函数

在MATLAB语言中,基本初等函数是指三角函数、对数函数、指数函数和复数运算函数等,执行这些函数时按照数组的运算规则进行,即对数组的每个元素进行同等操作。MATLAB基本初等函数及其功能如表2-8所示。

表2-8 MATLAB基本初等函数及其功能

2.1.5 向量和下标

从另一个角度看矩阵,可以认为矩阵是由一组向量组成,即可以将向量看成是矩阵的组成元素。此时,所有矩阵的运算都能分解为一系列相应的向量运算。由线性代数的知识可以知道,向量分为行向量和列向量两种,对行向量做转置运算可以得到列向量,对列向量做转置运算可以得到行向量。

1.向量的创建

MATLAB语言可以用以下4种方式创建向量。

1)直接输入创建向量

同简单矩阵的输入一样,向量的创建最直接的方法就是在命令窗口中直接输入。向量元素需要用方括号“[ ]”括起来,元素之间可以用空格、逗号或分号分隔。元素之间用逗号和空格分隔则产生行向量,用分号分隔则产生列向量。

【例2-31】直接创建向量示例。

      >>a=[2589]  %输入行向量
      a=
          2    5    8    9
      >>b=[4;5;7]  %输入列向量
      b=
          4
          5
          7

2)利用增量赋值法创建向量

与矩阵的输入相同,可以用增量赋值法创建向量。此时可以不使用方括号“[ ]”。

【例2-32】增量赋值法创建向量示例。

      >> a=0.5:1:8
      a=
        0.5000   1.5000   2.5000   3.5000   4.5000   5.5000   6.5000   7.5000
      >> b=12:-2:1
      b=
          12   10    8    6    4    2
      >> c=1:7:1
      c=
          1
      >> d=1:5
      d=
          1    2    3    4    5

3)利用线性等分函数创建向量

MATLAB语言,提供了线性等分功能函数linspace,用来创建线性等分向量,其使用格式有两种。

(1)y=linspace(x1, x2)

产生100维的行向量,使得y(1)=x1, y(100)=x2

(2)y=linspace(x1, x2, n)

产生n维的行向量,使得y(1)=x1, y(n)=x2

线性等分函数和增量赋值法都能创建等分向量。但它们创建的方式有所不同,前者是先设定了向量的维数然后生成等间隔向量,而后者是通过设定间隔大小来生成维数,随之确定等间隔向量。

【例2-33】创建线性等分向量。

      >> a=linspace(1,100,5)
      a=
          1.0000   25.7500   50.5000   75.2500  100.0000
      >> b=linspace(1,100)
      b=
        Columns 1 through 15
          1   2   3   4   5   6   7   8   9   10   11   12  13   14   15
        Columns 16 through 28
      16   17   18   19   20   21   22   23   24   25   26   27   28
        Columns 29 through 40
      29   30   31   32   33   34   35   36   37   38   39   40
      Columns 41 through 52
      41   42   43   44   45   46   47   48   49   50   51   52
      Columns 53 through 64
      53   54   55   56   57   58   59   60   61   62   63   64
      Columns 65 through 76
      65   66   67   68   69   70   71   72   73   74   75   76
      Columns 77 through 88
      77   78   79   80   81   82   83   84   85   86   87   88
       Columns 89 through 100
      89   90   91   92   93   94   95   96   97   98   99   100

4)创建对数等分向量

在自动控制原理、数字信号处理等课程中常常需要对数刻度坐标,对此,MATLAB语言提供了对数等分功能函数。对数等分函数有两种具体的应用形式。

(1)y=logspace (x1, x2)

创建50维对数等分向量,使得y(1)=10x1, y(50)=10x2

(2)y=logspace (x1, x2, n)

创建n维对数等分向量,使得y(1)=10x1, y(n)=10x2

【例2-34】创建对数等分向量示例。

      >> a=[1 3 5 7;2 4 6 8;0 1 6 9]
      a=
          1    3    5    7
          2    4    6    8
          0    1    6    9
      >>a(3,3)=a(1,3)+a(3,1)  %将a(1,3)的值与a(3,1)的值之和赋给a(3,3)
      a=
          1    3    5    7
          2    4    6    8
          0    1    5    9

下标可以是一个向量。使用下标可以将矩阵中任意元素组合,构成新的矩阵。在矩阵中使用“:”代替下标可以表示矩阵所有的行或列。

【例2-35】矩阵元素的下标表示示例。

      >> a=[5 7 9 11 17]
      a=
          5    7    9   11   17
      >> b=[5 1 3 2 4]
      b=
          5    1    3    2    4
      >>c=a(b)  %改变向量a的元素的顺序
      c=
          17    5    9    7   11
      >> x=[1 7;5 8;3 9], y=x(:)
      x=
          1    7
          5    8
          3    9
      y=
          1
          5
          3
          7
          8
          9
      >>x(:)=12:17   %对矩阵a重新赋值
      x=
          12   15
          13   16
          14   17

x(:)在赋值语句的右边,表示将a的所有元素在一个长的列向量中展成串;如果a(:)在赋值语句的左边,则可以重新组成与原来的矩阵a具有相同阶数的矩阵,这相当于在原来的矩阵a没有被清除的情况下,用新的元素置换,实际上起了一种提供格式的作用。

2.0-1向量的下标

【例36】从关系运算和逻辑运算中可以建立0-1向量,0-1向量可以用于对矩阵建立子矩阵。

      >> a=[2 4 6;1 3 7;5 8 9]
      a=
          2    4    6
          1    3    7
          5    8    9
      >> v1=[1;1;0]
      v1 =
          1
          1
          0
      >> v2=[1 0 1]
      v2 =
          1    0    1
      >>v1=v1==1  %将向量v1转换为逻辑向量
      v1 =
          1
          1
          0
      >> v2=v2==1 %将向量v2转换为逻辑向量
      v2 =
          1    0    1
      >> b=a(v1, :)
      b=
          2    4    6
          1    3    7
      >> c=a(:, v2)
      c=
          2    6
          1    7
          5    9
      >> d=a(v1, v2)
      d=
          2    6
          1    7

其中v1v2是由元素0和1组成的长度分别为矩阵a的行维数和列维数的向量。如果v1v2的元素取1,则表示取矩阵a对应位置上的行或列,如果为0,则不取。v1v2都必须是逻辑向量,即向量的元素为逻辑值,否则MATLAB会显示出错信息。

3.空矩阵

MATLAB语言支持多维空矩阵的使用,这给编程和运算带来了方便。MATLAB定义“[ ]”为空矩阵。一个被赋予空矩阵的变量应具有以下4个性质。

(1)在MATLAB工作内存中确实存在被赋空矩阵的变量。

(2)空矩阵中不包含任何元素,它的阶数是0×0。

(3)空矩阵可以在MATLAB的运算中传递。

(4)可以使用函数clear从内存中清除空矩阵变量。

空矩阵不是0矩阵,也不是“不存在”。空矩阵可以用来对一般矩阵按要求进行缩维。

【例2-37】

      > a=1:21;
      >>b=reshape(a,3,7)   %将行向量重新排列成矩阵
      b=
          1    4    7   10   13   16   19
          2    5    8   11   14   17   20
          3    6    9   12   15   18   21
      >> c=b(:, [3 5 7])
      c=
          7   13   19
          8   14   20
          9   15   21
      >> b(:, [2 4])=[]
      b=
          1    7   13   16   19
          2    8   14   17   20
          3    9   15   18   21

2.1.6 其他基本函数

MATLAB语言中除了提供一些基本初等函数外,还提供了其他函数。

1.矩阵创建函数

MATLAB语言可以由矩阵创建函数来生成一些特殊矩阵。MATLAB的矩阵生成函数及其功能如表2-9所示。

表2-9 MATLAB矩阵生成函数及其功能

1)全零矩阵和全1矩阵

全零矩阵是指各个元素都为零的矩阵,MATLAB语言使用函数zeros来建立一个全零矩阵,其使用格式有3种。

(1)A=zeros (m, n)建立阶数为m×n的全零矩阵。

(2)A=zeros (size (B))建立与已知矩阵B阶数相同的全零矩阵。

(3)A=zeros (n)建立一个阶数为n×n的全零矩阵。

全1矩阵是指矩阵的元素值全部为1, MATLAB语言使用函数ones来建立一个全1矩阵,其使用格式与全零矩阵的建立格式一致。

【例2-38】建立全零矩阵和全1矩阵示例。

      >> B=[1 3 7 9;2 4 6 8;1 9 5 7;2 3 7 1]
      B=
          1    3    7    9
          2    4    6    8
          1    9    5    7
          2    3    7    1
      >> C=zeros(size(B))
      C=
          0    0    0    0
          0    0    0    0
          0    0    0    0
          0    0    0    0
      >> D=ones(3)
      D=
          1    1    1
          1    1    1
          1    1    1

2)随机矩阵

随机矩阵是指其元素由随机数构成的矩阵。在MATLAB语言中,使用函数rand和randn可以建立多种随机矩阵,它们的使用格式为:

(1)rand(n):生成n×n阶随机矩阵,矩阵元素的值在区间(0,1)内,且服从均匀分布。

(2)rand(m, n):生成m×n阶随机矩阵,矩阵元素的值在区间(0,1)内,且服从均匀分布。

(3)randn(n):生成n×n阶随机矩阵,矩阵元素的值服从正态分布N (0,1)。

(4)randn(m, n):生成m×n阶随机矩阵,矩阵元素的值服从正态分布N(0,1)。

【例2-39】建立随机矩阵示例。

      >> rand(4)
      ans =
          0.8147   0.6324   0.9575   0.9572
          0.9058   0.0975   0.9649   0.4854
          0.1270   0.2785   0.1576   0.8003
          0.9134   0.5469   0.9706   0.1419
      >> randn(3,4)
      ans =
          -0.4326      0.2877      1.1892      0.1746
          -1.6656      -1.1465      -0.0376      -0.1867
          0.1253      1.1909      0.3273      0.7258

3)对角矩阵

对角矩阵是指某条对角线上元素为任意数,而其他元素全部为零的矩阵。MATLAB语言的函数diag(V, K)用来建立一个对象矩阵,其中V为某个向量,K为向量V偏离主对角线的列数。K为零时表示V为主对角线,K大于零时表示V在主对角线以上,K小于零时表示V在主对角线以上。

【例2-40】建立对角矩阵示例。

      >> v=[2 4 7 11];
      >> a=diag(v)
      a=
          2    0    0    0
          0    4    0    0
          0    0    7    0
          0    0    0   11
      >> b=diag(v,1)
      b=
          0    2    0    0    0
          0    0    4    0    0
          0    0    0    7    0
          0    0    0    0   11
          0    0    0    0    0
      >> c=diag(v, -2)
      c=
          0    0    0    0    0    0
          0    0    0    0    0    0
          2    0    0    0    0    0
          0    4    0    0    0    0
          0    0    7    0    0    0
          0    0    0   11    0    0

4)魔方矩阵

魔方矩阵是人们经常会碰到的一类矩阵,一个魔方矩阵是一个方阵,并且方阵的每一行、每一列及每条主对角线上的所有元素之和都相等(二阶方阵除外)。在MATLAB语言中,使用命令magic(n)可以生成n×n阶魔方矩阵。

【例2-41】运用魔方矩阵函数magic产生的三维图形应用示例。

在M文件编辑器中输入以下代码。

      clear;
      for n=8:11,
          subplot(2,2, n-7);
          surf(magic(n));
          title(num2str(n));
          axis off;
          view(30,45);
          axis tight;
      end

执行程序后的结果如图2-1所示。

图2-1 运用magic函数产生的三维图形

5)Hilbert矩阵和反Hilbert矩阵

Hilbert矩阵是工程问题中一个特殊的病态矩阵,它的第i列的元素值为1/(i+ j-1)。而反Hilbert矩阵是Hilbert矩阵的逆矩阵。在MATLAB语言中,使用函数hilb(n)和invhilb(n)可以生成n×n阶的Hilbert矩阵和反Hilbert矩阵。

【例2-42】建立Hilbert矩阵和反Hilbert矩阵示例。

      >> s=hilb(3)
      s=
          1.0000   0.5000   0.3333
          0.5000   0.3333   0.2500
          0.3333   0.2500   0.2000
      >> x=invhilb(3)
      x=
          9   -36   30
        -36   192  -180
          30  -180   180
      >> y=s*x
      y=
          1    0    0
          0    1    0
          0    0    1

2.多变量函数

在MATLAB中,可以把一个多变量的数学函数表示成一个M文件的MATLAB函数,或者是用字符串表达式创建成一个内联函数。

【例2-43】求函数,在(7,13,3)处的值。

1)表示成MATLAB函数

      function w=hp(x, y, z)  %创建MATLAB函数
      w=1/((x-0.5)^3+0.5)+1/((y+2)^1-2)-24*z
      >> w=hp(7,13,3);
      w=
        -71.9194
      >>fw=@hp;  %用@来获取hp的函数句柄
      >> feval(fw,7,13,3)
      w=
        -71.9194

2)创建成内联函数

      >> w=inline('1/((x-0.5)^3+0.5)+1/((y+2)-3)-24*z' , ' x' , ' y' , ' z' )
      %创建内联函数,即inline对象
      w=
          Inline function:
          w(x, y, z) = 1/((x-0.5)^3+0.5)+1/((y+2)-3)-24*z
      >> w=w(7,13,3)
      w=
        -71.9130

3.大矩阵的建立

当矩阵的维数比较大,用直接输入法输入就显得有些笨拙,在输入过程中出现错误也不易修改。MATLAB可以用两种方式来建立大矩阵。

1)建立M文件输入大矩阵

此时的M文件是一种可以在MATLAB环境下运行的文本文件,用它的最简单形式可以建立大型矩阵。要输入大矩阵,可以先将矩阵按格式写入一个文本文件中,并将此文件以.m为其扩展名保存。在MATLAB的命令窗口中输入此M文件名,则所要输入的大型矩阵就已被输入到系统的内存中。

【例2-44】建立M文件输入大矩阵示例。

      %exp.m
      %创建M文件输入大矩阵示例
      exm=[456586 987563 12311234223 224 2 7123 584645 123111 101];
      >> exp;
      >> size(exm)
      ans =
          1   16

在通常的使用中,本例中的矩阵还不算是大型的,从此例中可以看出大型矩阵用创建M文件的方式输入是简便的。

2)扩充小矩阵建立大矩阵

矩阵的扩充就是由小矩阵生成大矩阵。矩阵的扩充一般用中括号来完成,在扩充过程中要保证所生成的矩阵各行和各列的元素数目各自相等,否则系统会显示出错信息。

【例2-45】扩充小矩阵建立大矩阵示例。

      >> a=[3 4 6 7 8;11 22 33 44 55];
      >> b=eye(3);
      >> c=zeros(3,2);
      >> d=[a; b c]
      d=
          3    4    6    7    8
          11   22   33   44   55
          1    0    0    0    0
          0    1    0    0    0
          0    0    1    0    0
      >> d(6,7)=99
      d=
          3    4    6    7    8    0    0
          11   22   33   44   55    0    0
          1    0    0    0    0    0    0
          0    1    0    0    0    0    0
          0    0    1    0    0    0    0
          0    0    0    0    0    0   99

在小矩阵中,对超出矩阵维数的元素直接赋值,也可以实现矩阵的扩充,其余未被赋值的元素用0补齐。

4.磁盘文件

磁盘文件是记录在外部介质也就是磁盘上的数据集合。通常情况下,MATLAB语言的磁盘文件有两类。

1)文本文件

文本文件是完全由字符和与字符的显示格式有关的控制符(如空格符、回车符与换行符等)构成的。文本文件可以很容易地在不同的操作系统、不同的应用软件之间通用,只是需要这些操作系统和应用软件遵循相同的字符代码标准即可。文本文件常用.txt、.bat与.htm等作为其扩展名。

2)二进制文件

二进制文件为非文本文件,这类文件通常依赖于特殊的软件,具有各种不同的内部格式。二进制文件有扩展名为.com和.exe的程序文件,存放图像数据扩展名为.bmp的文件,以及存放声音数据扩展名为.wav的文件等。

MATLAB语言提供了一些常用的磁盘文件操作函数,如表2-10所示。

表2-10 常用的磁盘文件操作函数

2.1.7 数据分析

MATLAB对数据分析指令的两条规定如下:

(1)若输入X是向量,那么不论是行向量还是列向量,运算是对整个向量进行的。

(2)若输入 X 是数组(或矩阵),那么指令运算是按列进行的。即默认每个列是由一个变量的不同“观察”所得的数据组成。

这两条规定不仅应用于本书所提到的指令,而且反映在MATLAB各工具包的软件中,为此,用户在编制自己的程序时,应遵循这两条规定,以便更好地利用MATLAB现有的函数。

1.基本统计函数指令

(1)min(X):求出X各列的最小元素。

(2)max (X):求出X各列的最大元素。

(3)mean(X):求X各列的平均值。

(4)median(X):求出X各列的中位元素。

(5)std(X):求出X各列的标准差。

(6)prod(X):求出X各列元素的积。

(7)sum(X):求出X各列元素之和。

(8)S=cumsum(X):求X各列元素累计和(可用于积分计算)。S与X同维,且

(9)cumprod (X):求X各列元素累计积。P与X同维,且

(10)sort(X):使X各列元素按递增排序。

【例2-46】统计计算,加深了解上述函数。

      >> randn(' seed' ,0);
      >> a=randn(100,5);
      >> a_max=max(max(a))
      a_max =
          3.2069
      >> a_end=median(a)
      a_end =
          0.1489   0.0301   0.0443   -0.0189   0.1375
      >> a_mean=mean(a)
      a_mean =
          0.0727   0.0264   0.0351   0.0424   0.0752
      >> a_prod=prod(a)
      a_prod =
        1.0e-020 *
        -0.0000   0.1268   -0.0000   -0.0000   0.0007

2.协方差阵和相关阵

(1)C=cov(X):求协方差阵cov{X}=E{(X -μx)T(X -μx)}。

(2)C=cov(X, Y):求两随机变量的协方差

(3)P=corrcoef(X):求相关阵,且

【例2-47】协方差阵和相关阵示例。

      >> rand(' seed' ,2);
      >> a=rand(12,3);
      >> b=rand(12,3);
      >> a_cov=cov(a)
      a_cov =
          0.1194      0.0152      -0.0211
          0.0152      0.0943      -0.0030
          -0.0211      -0.0030      0.0703
      >> b_cov=cov(b)
      b_cov =
          0.0869      0.0232      -0.0211
          0.0232      0.0527      0.0023
          -0.0211      0.0023      0.0493
      >> ab_cov=cov(b, a)
      ab_cov =
          0.0608   0.0074
          0.0074   0.0910
      >> ab_corrcoef=corrcoef(b, a)
      ab_corrcoef =
          1.0000   0.1001
          0.1001   1.0000

3.有限差分和导数

(1)DX =diff(X, k):按(m× n)维X阵的列求(m-knk阶差分矩阵。

(2)V =del2(X):求(m×n)维X阵(m×n)五点格式差分矩阵。

(3)d yx=diff(Y)./diff(X):YX是同维矩阵,差分计算按列进行。

(4)d yx=gradient(Y, d x):Y是向量,dx(默认值为1)是X 的分度值。

(5)[GX,GY]=gradient(Z,dx,dy):GX, GY分别是二元函数,

(6)Cyx=gradient(Z,dx,dy):复数阵Cxy的实、虚部分别是,

说明:

五点格式差分算法源于拉普拉斯方程和泊松方程的差分解法。

在求偏导指令中,若输入量dx, dy取标量值,则它们表示求近似偏导数时自变量的分度值。若输入量dx, dy取向量值,则它们分别表示求近似偏导数的自变量绝对坐标值。dx的长度与Z的列维相同,dy的长度与Z的行维相同。

在求偏导数指令中:GX与Z同维,它给出在自变量绝对坐标值所决定网点上的偏导数值;GY也与Y同维,它给出在自变量绝对坐标值所决定网点上的偏导数值。

【例2-48】求差分示例。

      >> a=[1 4 7;33 66 9;4 7 0;63 12 11]
      a=
          1    4    7
          33   66    9
          4    7    0
          63   12   11
      >> b=diff(a)
      b=
          32   62    2
        -29   -59   -9
          59    5   11

【例2-49】求解五点格式差分(u=x2+y2, Δ2u=4)。

      >> [x, y]=meshgrid(-5:5, -3:3);
      >> u=x.^2+y.^2
      u=
          29   20   13    8    5    4    5    8   13   20   29
          26   17   10    5    2    1    2    5   10   17   26
          25   16    9    4    1    0    1    4    9   16   25
          26   17   10    5    2    1    2    5   10   17   26
          29   20   13    8    5    4    5    8   13   20   29
      >> u2=4*del2(u)
      u2 =
          4    4    4    4    4    4    4    4    4    4    4
          4    4    4    4    4    4    4    4    4    4    4
          4    4    4    4    4    4    4    4    4    4    4
          4    4    4    4    4    4    4    4    4    4    4
          4    4    4    4    4    4    4    4    4    4    4

4.数据滤波

Y=filter (B, A, X):该函数的作用是数字滤波。该滤波器的数学模型为:

a(1)*y(n)=b(1)*x(n)+b(2)*x(n-1)+…+b(nb+1)*x(n-nb)-a(2)*y(n-1)-…-a(na+1)*y(n-na)

【例2-50】数据滤波示例。

      t=linspace(0,9,99);
      c=cos(2*pi/5*t);
      noise=0.2*rand(size(t));
      x=c+noise;
      y=zeros(size(x));
      a=[- -0.9];
      b=[0.05 0.06];
      y=filter(b, a, x);
      plot(t, x, ' b--' , t, y, ' r' );

运行程序效果如图2-2所示。

图2-2 数据滤波示例

2.1.8 数值分析

1.数值积分

● 求函数的数值积分。

(1)Q=quad(' F' , A, B, tol, trace):自适应递推辛普生(Simpson)法求数值积分。

'F’为被积函数表达式字符串或者函数的文件名;A, B分别为积分的上、下限;tol用来控制积分精度,缺省时,默认tol=0.001; trace若取1则用图形展现积分过程,取0时无图形。缺省时不画图。

(2)Q=quad8(' F' , A, B, tol, trace)。参数含义同上。值得说明的是,quad8比quad有更高的积分精度。

【例2-51】已知,求

在M文件编辑器中输入以下代码,命名为esin.m文件。

function y=esin(t)

y=exp(-0.5*t).*sin(t+pi/6);

把写好的esin.m文件存放于用户自己的工作目录(如D:\My Documents\MATLAB)。

调用积分指令,运行结果如下所示。

      >> s=quad(' esin' ,0,3*pi)
      s=
          0.9008
      >> s=quad8(' esin' ,0,3*pi)
      s=
          0.9008

● 通过采样向量求数值积分。

(1)Z=trapz(X, Y):用梯形法求数值积分。在trapz中,当XY是同维的列(行)向量时,所得的Z将是标量,它给出Y相对于X的积分值;当Ym×n维矩阵时,X必须是m×1的列向量,积分对Y各列分别进行,计算所得1×nZ的元素是对应列函数对于X的积分。在该指令中,X默认时,认为Y为单位步长等距采样所得的函数。

(2)Sc=cumsum(X):用欧拉法求积分函数值。cumsum的运算结果Sc与X同维,Sc的各列给出X相应列的积分函数值,且认为积分采用的是等距单位步长。一般来说,该积分的精度较差。

【例2-52】用梯形法和欧拉法求例2-52中的数值积分。

      >> d=pi/100;
      t=0:d:3*pi;
      nt=length(t);
      y=exp(-0.5*t).*sin(t+pi/6);
      z=trapz(y)*d
      z=
          0.9008
      >> sc=cumsum(y)*d;
      >> scf=sc(nt)
      scf =
          0.9086

2.微分方程的数值解

(1)[t, x]=ode23(' F' , tspan, x0)

(2)[t, x]=ode45(' F' , tspan, x0)

两个指令的调用格式完全相同,均采用Runge-Kutta法。该两个指令是对一阶常微分方程设计的。因此,假如待解的是高阶微分方程,那么它必须先被转化为形如的一阶微分方程组,即“状态方程”。而第一个输入参 ’数F’是定义f(x, t)的函数文件名,文件必须以为输出,以t, x为输入。tspan=[t0 tfinal], t0、tfinal分别是积分的起始值和终止值。一般来说,ode45比ode23的积分分段少,而运算速度更快。

【例2-53】求著名的VanderPol方程

首先,转化为状态方程。

,那么可把写成状态方程形式

然后,建立函数文件xexp.m

      function xdot=xexp(t, x)
      xdot=zeros(2,1);
      xdot(1)=(1-x(2)^2)*x(1)-x(2);
      xdot(2)=x(1);

注意

(1)函数文件第一行函数的输入参数一定是两个;次序一定是先“时间变量”后“状态变量”。

(2)函数文件的第二行使xdot成为二 元零向量(建议采用列向量,以便被MATLAB其他指令调用),这行是为后两行对xdot元素的调用做准备。

最后,解微分方程,其程序如下:

      tspan=[0,20];
      x0=[0,0.25]' ;
      [t, x]=ode23(' xexp' , tspan, x0);
      plot(t, x(:,1), ' r--' , t, x(:,2), ' g' );
      legend(’速度’, ’位移’);

程序的运行结果如图2-3所示。

图2-3 例2-54效果图

2.1.9 矩阵分解

MATLAB语言的数学计算与数据处理的能力之所以强大,主要是因为它的矩阵函数的功能强大。本节主要介绍MATLAB矩阵函数中的矩阵分解运算,矩阵分解运算在数值分析中具有重要的地位。MATLAB中常用的矩阵分解运算方法有正交分解、三角分解、奇异值分解和特征值分解法等。

1.正交分解

在数值分析中,为了求矩阵的特征值,引入了一种矩阵的正交分解方法,即OR法。如果矩阵A非奇异,则存在一个正交矩阵Q和一个上三角矩阵R,使得A=QR。当矩阵A的对象线元素都为正数时,QR分解是唯一的。在MATLAB语言中,矩阵的QR正交分解可以由命令函数qr实现。

【例2-54】矩阵的正交分解示例。

      >> x=magic(4);
      >> x(2,3)=7
      x=
          16    2    3   13
          5   11    7    8
          9    7    6   12
          4   14   15    1
      >>[Q, R]=qr(x)  %产生一个正交矩阵Q和一个上三角矩阵R,并满足X=QR
      Q=
        -0.8230   0.4186   0.1526    -0.3525
        -0.2572   -0.5155   -0.7458    -0.3345
        -0.4629   -0.1305   -0.1385    0.8657
        -0.2057   -0.7363   0.6334    -0.1197
      R=
        -19.4422   -10.5955   -10.1326  -18.5164
              0   -16.0541   -14.1795   -0.9848
              0        0    3.9079   -5.0110
              0        0        0   3.0104
      %产生一个正交矩阵Q、一个上三角矩阵R和一个交换矩阵E,并满足XE=QR
      >> [Q, R, E]=qr(x)
      Q=
        -0.8230    0.4186   0.3123   -0.2236
        -0.2572   -0.5155   -0.4671   -0.6708
        -0.4629   -0.1305   -0.5645   0.6708
        -0.2057   -0.7363   0.6046   0.2236
      R=
        -19.4422   -10.5955  -18.5164  -10.1326
              0   -16.0541   -0.9848  -14.1795
              0        0   -5.8458   3.3499
              0        0       0   2.0125
      E=
          1    0    0    0
          0    1    0    0
          0    0    0    1
          0    0    1    0

2.三角分解

三角分解(LU分解)是矩阵分解的基本方法,它在线性方程组的直接解法中有重要的应用。由数值分析的知识可知,一个非奇异矩阵 A,如果其顺序主子式均不为零,则存在唯一的下三角矩阵L和上三角矩阵U,使得A=LU。在MATLAB中,矩阵的三角分解可以由命令函数lu实现。

【例2-55】分别用两种方法对下面的矩阵进行分解:

      >> A=[4 5 6;4 8 7;2 6 3]
      A=
          4    5    6
          4    8    7
          2    6    3
      >> [L1, U1]=lu(A)
      L1 =
          1.0000       0        0
          1.0000   0.8571    1.0000
          0.5000   1.0000        0
      U1 =
          4.0000    5.0000   6.0000
              0    3.5000       0
              0        0   1.0000
      >> L1*U1
      ans =
          4    5    6
          4    8    7
          2    6    3
      >> [L, U, P]=lu(A)
      L=
          1.0000       0       0
          0.5000   1.0000       0
          1.0000   0.8571   1.0000
      U=
          4.0000    5.0000    6.0000
              0    3.5000        0
              0        0    1.0000
      P=
          1    0    0
          0    0    1
          0    1    0
      >>L*U  %这个结果显示不是A
      ans =
          4    5    6
          2    6    3
          4    8    7
      >>inv(P)*L*U   %这个结果才是A
      ans =
          4    5    6
          4    8    7
          2    6    3

3.奇异值分解

对于任意矩阵A,总有A T≥0, A A T≥0,且有rank(AAT)=rank(AT A)=rank(A)。可以证明,A A TATA具有相同的非零特征值,这些非零特征值总是正数。通常把这些非零特征值的平方根称为矩阵A的奇异值。奇异值是矩阵的一种测度,它决定矩阵的性态。在MATLAB中,矩阵的奇异值分解可以通过命令函数svd来实现。

【例2-56】矩阵的奇异值分解示例。

      >> x=magic(4);
      >> x(2,3)=9
      x=
          16    2    3   13
          5   11    9    8
          9    7    6   12
          4   14   15    1
      %生成与矩阵x阶数相同的对角矩阵s、正交矩阵u和正交矩阵v,这四个矩阵满足关
      %系式x=usv
      >> [u, s, v]=svd(x)
      u=
        -0.5078   0.6629   0.4969   -0.2363
        -0.4878   -0.2084   -0.5336   -0.6587
        -0.5052   0.2133   -0.4728   0.6897
        -0.4990   -0.6868   0.4947   0.1861
      s=
        33.7563        0        0        0
              0   17.7804        0        0
              0        0   4.6012        0
              0        0        0   0.4432
      v=
        -0.5068    0.4914   0.6531   -0.2742
        -0.5007    -0.5112   -0.2738   -0.6426
        -0.4867   -0.5011   0.2764   0.6600
        -0.5055    0.4962   -0.6497   0.2760
      %奇异值的最佳分解。x为m×n阶矩阵,当m>n时,生成的矩阵u只有前n列元素
      %被计算出来,且s为n×n阶矩阵
      >> [u, s, v]=svd(x,0)
      u=
        -0.5078   0.6629   0.4969   -0.2363
        -0.4878   -0.2084   -0.5336   -0.6587
        -0.5052   0.2133   -0.4728   0.6897
        -0.4990   -0.6868   0.4947   0.1861
      s=
        33.7563        0        0        0
              0   17.7804        0        0
              0        0   4.6012        0
              0        0        0   0.4432
      v=
        -0.5068   0.4914   0.6531   -0.2742
        -0.5007   -0.5112   -0.2738   -0.6426
        -0.4867   -0.5011   0.2764   0.6600
        -0.5055   0.4962   -0.6497   0.2760

4.特征值分解

在MATLAB语言中,矩阵的特征值分解是利用命令函数eig来实现的。

【例2-57】矩阵的特征值分解示例。

      >> x=magic(4)
      x=
          16    2    3   13
          5   11   10    8
          9    7    6   12
          4   14   15    1
      %生成两个矩阵v和d,其中矩阵v是以矩阵x的特征向量作为列向量组成的矩阵,
      %而矩阵d是以矩阵x的特征值作为对角线元素构成的矩阵,它们满足关系式xv=xd
      >> [v, d]=eig(x)
      v=
        -0.5000   -0.8236   0.3764   -0.2236
        -0.5000   0.4236   0.0236   -0.6708
        -0.5000   0.0236   0.4236   0.6708
        -0.5000   0.3764   -0.8236   0.2236
      d=
        34.0000        0        0        0
              0   8.9443        0        0
              0        0   -8.9443        0
              0        0        0    0.0000
      >> z=x*v-v*d
      z=
        1.0e-013 *
        -0.0355   -0.0266   0.0222   0.0288
        -0.1776    0.0178   0.0053   -0.0092
        -0.0711   -0.0208   -0.0133   -0.0152
            0   -0.0133   0.0355   0.0015
      >>y=round(18*rand(4,4))
      y=
         15   11   17   17
         16    2   17    9
          2    5    3   14
         16   10   17    3
      >>[v, d]=eig(x, y)
      v=
        1.0000           0.3333         0.4114-0.2498i   0.4114+0.2498i
        0.0440           1.0000         0.4618-0.2440i   0.4618+0.2440i
       -0.9668           -1.0000         -0.3374+0.1975i  -0.3374-0.1975i
        0.0445           -0.3333        -0.9984+0.0016i  -0.9984-0.0016i
      d=
      -70.9701                0        0                 0
            0          -0.0000        0                 0
            0               0        0.6125+0.1750i       0
            0               0        0           0.6125-0.1750i
      >>z=x*v-y*v*d
      z=
       1.0e-012*
        0.1830           -0.0049          -0.0124         -0.0124
        0.2878           0.0042           0.0009-0.0040i   0.0009+0.0040i
        0.0151           0.0029           0.0027-0.0004i   0.0027+0.0004i
        0.3286           0.0108           0.0071-0.0062i   0.0071+0.0062i

2.1.10 矩阵的其他相关操作

1.矩阵的秩

矩阵秩的大小就是矩阵中线性无关的行数和列数。矩阵的秩是线性代数中相当重要的概念之一。通常矩阵都可以经过初等变换或列变换,将其转化为行阶梯形矩阵,而行阶梯形矩阵所包含的非零行的行数是一定的,而这个确定的非零行的行数就是矩阵的秩。在MATLAB语言中,矩阵的秩可以通过命令函数rank来求得。

【例2-58】求矩阵的秩示例。

      >> x=magic(4)
      x=
          16    2    3   13
          5   11   10    8
          9    7    6   12
          4   14   15    1
      >> rank(x)
      ans =
          3
      >> rref(x) %求矩阵x的行阶梯形矩阵
      ans =
          1    0    0    1
          0    1    0    3
          0    0    1    -3
          0    0    0    0

2.多项式

多项式在工程计算中有着广泛的应用,在很多情况下,特殊函数都可以用Taylor级数展开成多项式的形式,工程中有许多特殊曲线可以用多项式进行曲线拟合。MATLAB中有许多关于多项式的内部函数,其中包含多项式的定义函数和多项式的运算函数。

1)多项式的定义

在MATLAB语言中,多项式有两种定义方式。

(1)直接输入。MATLAB采用行向量表示多项式,将多项式的系数按降幂次序存放在行向量中即可。

【例2-59】多项式直接输入示例。

      >> a=[3-11 4-44 1];
      %poly2sym是符号工具箱中的函数,它将多项式向量表示成为符号多项式的形式
      >> poly2sym(a)
       ans =
       3*x^4-11*x^3+4*x^2-44*x+1

(2)用命令poly创建。如果A是矩阵,则poly(A)将创建矩阵A的特征多项式;如果A是向量,则poly(A)将创建以A中各元素为根的多项式。

【例2-60】用命令poly创建多项式示例。

      >>a=[66 3 7;2 6  9;99 88 55]
      a=
          66    3    7
          2    6    9
          99   88   55
      >> poly(a)
      ans =
        1.0e+004 *
          0.0001   -0.0127   0.2865   3.1075
      >> b=[2 5 8]
      b=
          2    5    8
      >> poly(b)
      ans =
          1   -15   66   -80

2)多项式的运算

MATLAB语言提供了大量关于多项式运算的内部函数。表2-11列出了常用的多项式运算函数。

表2-11 常用的多项式运算函数

【例2-61】多项式的运算示例。

      >> a=[3 5 7 9];
      >> b=[-3-7-9 22];
      >>roots(a)   %求多项式a的根
      ans =
        -1.4687
        -0.0990 + 1.4258i
        -0.0990-1.4258i
      >>polyder(b)   %多项式b求导
      ans =
          -9   -14   -9
      >>conv(a, b)  %多项式a与b相乘
      ans =
          -9   -36   -83   -55   -16   73   198