2 MATLAB语言语法要素 素用方括号括起来,按矩阵行的顺序输入各元素,元素与元素之间用空格或逗号分开,用分 号将每行的元素分开。例如,在键入下列的 MATLAB语句: A=[123;456;789] 后, MATLAB执行该语句的输出结果是 456 789 这样,在 MATLAB的工作空间中就创建了一个新的矩阵对象A,以后就可以使用矩阵A。 也可以用回车键代替分号,按下列的方式输入 A=[123 456 789] 对于大的矩阵,可以按矩阵的输入方式编辑一个M文件。例如如果一个名为 mydata m的文本文件的内容如下 A=[1 456 789] 那么,语句 》 mydata 将读入M文件 mydata,m,并执行其语句,生成同样的矩阵A。另外,load命令和 fread函数 都可以用来输入矩阵。 2 MATLAB的变量和表达式 在 MATLAB中有两个基本概念:变量和表达式。变量由变量名表示,函数名作为特殊 的变量名看待,每个变量名由一个字母后面跟随任意个字母或数字(包括下划线)组成但 MATLAB只能分辨前19个字符。 MATLAB能区分组成变量名的大小写字母,这样,变量 名a和A表示不同的变量,但所有的函数名要求是小写字母。例如,求矩阵A的逆用nv(A) 时,而若使用Inv(A)则会遇到“未定义函数”的警告。表达式则是由运算符、函数调用、变量 名以及特殊字符组成的类似于数学表达式的式子 MATLAB的语句则是下列两种形式之一: 》变量名=表达式 或者 表达式 在 MATLAB的矩阵管理方式中, MATLAB每执行一条输入的语句,表达式运算求值的结 果都是一个矩阵。在前一种语句形式下 MaTLaB将运算的结果赋给“变量名”;而在第 种语句形式下,将运算的结果赋绐 MATLAB的永久变量ans,每条语句以回车符结束。 般地,运算的结果在命令窗口中显示出来。如果语句的最后一个字符是分号“;”,那么 MATLAB仅仅执行赋值运算,不再显示运算的绪果;如果运算的结果是一个很大的矩阵或
笫一章 MATLAB系统与语言简介 是对运算结果不关心,则可以在语句的最后加上分号。M文件的语句常以分号结尾。例如: conver, r 只计算r与它自己的卷积,不显示卷积的结果 在一条语句中,如果表达式太复杂,一行写不下,可以加上三连点“…”并按下回车键,然 后接下去再写。例如 》s=1-1/2+1/3-1/4+1/5-1/6+1/7 1/8+1/9-1/10+1/11-1/12; 这条语句计算级数的部分和,并将计算的结果赋给变量s但是不显示任何结果 3.复数的表示 MATLAB提供对复数的操作与管理功能。在 MATLAB中复数的虚根单位用i或j 表示。例如,2=3+4*i与z=3+4*表示的是同一个复数。又如,下面的两条语句输入的 是相同的复数矩阵 A=[12;34]+i*[56;78] 》A=[1+5i2+6;3+7i4+8i 第一种输入形式是将i看作数量与矩阵作数量乘积;第二种形式是通常的矩阵创建方式, 但要注意的是,此时作为矩阵元素的复数在输入时中间不能有任何空格。表达式1+5(在 加号的两边有空格)表示两个数相加,此时,51就不是一个 MATLAB的合法数据,因而表达 式是错误的。例如,1.23e-4,(1.23与e之间有空格)也不是合法的 MATLAB数据。 按照 MATLAB的语法规则, MATLAB内部函数的名字能够作为变量的名字。当内部 函数名作为变量名时该函数在当前的工作层中不能再被调用,直到该变量被清除为止。如 果用i和j作为变量的名字,并且赋给了新的值,那么,和j不能再作为虚根单位使用。此 时,可以用类似于下面的语句生成新的虚根单位: 》ⅱ=sqrt(-1) 因此建议读者将i和j作为 MATLAB的保留字 4.数据的输人输出格式 MATLAB用通常的十进制数表示常数、小数和负数。与通常的数学表示一样,还可以 使用以10为幂的常数以及虚数。 MATLAB接受各种合法的数据输入,下面是一些合法的 MATLAB型数据 0.00001 9.63972381.60210E-20 6.02252e23 3.14159i 3e51 在 MATLAB内部,每一个数据元素都是用双精度数来表示和存储的。常数的相对精度 是eps,eps是 MATLAB的保留字其值为2220464950313-016。按照EE浮点算 术标准,大约有16位有效数字。 MATLAB能够表达的数值范围大致是10-3~1030 除了在语句的后面有分号的情况外, MATLAB将回显任何赋值语句的运算结果 MATLAB按照一定的数据输出格式在 MATLAB命令窗口中显示运算的结果,用户可以 用 format命令设置或改变数据输出格式。 format命令只影响数据输出格式,对 MATLAB 的内部计算和数据存储(MAT文件)数值精度不产生任何影响
1,2 MATLAB语言语法要素 如果输出矩阵的每个元素都是纯整数, MATLAB就用不加小数点的纯整数格式显示 结果。只要矩阵中有一个元素不是纯整数 MATLaB将按当前的输出格式显示计算结果 缺省的输出格式是 short格式,显示至5位有效数字。其他的输出格式可以给出更多的有效 数字。作为一个例子,假设输入为 x=[4/31.2345e-6] 那么,在各种不同的输出格式下的输出为 format short 33330.0000 > format short e 1.3333e+001.2345e format lons 1.3333333333330.00000123450000 》 format long e 1.333333333333+001.2345000000000e-06 > format bank 1.330.00 》 format hex 3f55555553eb4b623]abfd271 ++ 5字符串与字符串变量 与C语言一样, MATLAB将字符串当作数组或矩阵处理。在 MATLAB语言中,字符 串用单引号括起来(英文单引号字符用“”表示)。例如 >s='Use MatlaB 的输出结果是 Use MATLAB 字符串存储在行向量中,每个元素对应一个字符,其值为字符的ASCI码值。于是,字 符串变量s是1×10的矩阵,它包括Use与 MATLAB之间的一个空格字符。一些数学函数 也可以应用在字符串变量上。例如对字符串变量求绝对值abs(s),其结果是字符串中各字 符的ASCI码值组成的向量,尽管这个向量在维数与数值上与s的内部表示一样,但是它 们的变量属性是不同的。事实上, MATLAB对每个变量都定义了一个属性来说明该变量是 否是一个字符串变量。 MATLAB提供了几个与字符串操作有关的函数:函数 setstr的作用是将ASCI码值 转换成可显示的宇符;disp是将字符串变量的字符直接显示出来;istr用于检查一个变量 是否为字符串变量; strcmp用于字符串的比较; sprintf将数值按指定的格式转换成数值字 符串;m2sr和int2str也是将数值转换成字符串,读者可以看一看下列语句的运行结果 》f=70;c=(f-32)/1.8
IATLAB系统与语言简介 disp(L'Room temperature is', num2str(c),'degrees C ']> 与字符串有关的另一个函数是eval,该函数的调用形式为eval(t),其中t是字符串变量,它 的作用是把该变量的内容作为表达式或语句进行求值。例如,设t=10020,则 这个函数在程序设计中将起到很大的作用。 6其他数据结构 MATLAB5.0版提供了几种新的数据结构,下面分别作简单的介绍 (1)多维数组( Multidimensional Arrays) 通常 MATLAB的基本数据结构是矩阵,其维数是2,也就是说矩阵的每一个元素可 以用给出两个角标的方法来访问。多维数组的数据结构在很多程序设计语言中都有定义 MATLAB5.0版提供了这种数据结构。如果数组的角标数多于2,则这样的数组就称为多 维数组。在50版本中,一些用于创建特殊矩阵的标准 MATLAB函数,如 zeros,ones rad, randn等都可扩展为创建多维数组的函数。例如: R= randn(3,4,5); 表示创建一个阶为3×4×5的3维随机数组R其元素总数为60 维数组可以表示3维物理数据。在 MATLAB中,3维数组最重要的应用是表示矩阵 序列{A“)},此时,序列中第k个矩阵的第(i,j)个元素就可以用A(ik)表示 如果A是一个幻方矩阵,交换A的任何两列,得到的仍是一个幻方矩阵。于是,可以 一个3维数组将所有按这种方法创建的幻方矩阵记录下来。例如: 》A= magIc(4); >P= perms(1 4) M= zeros(4,4,24); > for k M(:,:,k)=A(:;p(k,:)); 假设第二条语句创建一个24×4阶矩阵每个行向量都是向量1:4的某个排列(共有24个 不同的排列)。于是,对任何1≤k≤24,M(:,:,k)是一个4阶幻方矩阵。 很多应用于矩阵的 MATLAB函数被扩展后都可应用于多维数组,例如: > sum(M,d) 表示n维数组M按第d角标方向进行求和,其结果应该是一个n-1维数组。其他许多面向 列运算的 MATLAB函数都可以按这种方式使用,如min,max等,参见本书1.4.3节。 (2)块数组( Cell arrays) 在 MATLAB50版中,另一种新的数据结构是所谓的块数组。块数组的元素是某些其
1.2 MATLAB语言语法要素 他数组的拷贝值。通常,块数组对象可以用cell函数创建,也可以用花括号运算符{}创建 访问块数组的元素的方法与访问多维数组的方法是一样的,只不过是用花括号将角标值括 起来再加上块数组变量名而已。例如: >C=(A sum(A)prod(prod(A)) 创建一个1×3的块数组。在上述语句中如果A是4阶幻方矩阵则它的运算结果如下 C [4×4 double][1×4 double][2092278988000 即C(1}是一个4×4阶矩阵,C{2)是1×4的行向量,而C{3)是一个数量 般来说,3维数组表达同阶的矩阵序列,而块数组可以表达不同阶的矩阵序列。例如: M=cel(8,1) Min)= magic(n); 1 [2×2 double] [3×3 double] 4×4 double] [5×5 double] 6×6 double [7×7 double] (3)结构( Structures) 结构是 MATLAB5.0的一种新型数组它的元素既不像多维数组那样是数值也不像 块数组那样是多维数组,它的元素可以认为是一种记录本身具有不同的域,元素要用域操 作符访问。例如 》S.name=! Jun Gao’; 》S. grade=B 表示创建一个数量结构对象具有3个域分别是name, score, grade。很明显,这样的结构 适于记录一个班级学生的成绩 结构可以是数组,所以可以用增加数组元素的方法来增加结构型数组的元素。在这种情 况下,结构型数组的每一个元素必须有相同的域。 MATLAB5.0提供的函数 struct可用于 对整个结构的元素赋值。例如 > S(2)= struct( 70, grade,'C)