1、第二章 基本语法2.1 MATLAB的矩阵、变量与表达式 在MATLAB系统中,只管理着一种对象-矩阵(包括复数矩阵),任何数量在MATLAB中是作为1x1的矩阵来处理的。 一、矩阵的创建: 1. 在MATLAB中创建矩阵的原则: (1) 矩阵元素必须写在“”内; (2) 矩阵的同一行之间用空格或“,”分隔; (3) 矩阵的行与行之间用分号或回车符分隔; (4) 矩阵的尺寸不必预先定义; (5) 矩阵元素可以是数值、变量、表达式或函数。 2. 创建矩阵的四种方法。 (1) 在命令窗口直接输入: 如输入:A=1,2,3;4,5,6;7,8,9 则显示:A= 1 2 3 4 5 6 7 8 9 也
2、可用空格代替逗号,用回车代替分号: 如上例:A=1 2 3 4 5 6 7 8 9 则显示:A= 1 2 3 4 5 6 7 8 9 (2) 由M文件创建矩阵: 有时编程需要用M文件创建矩阵。或者当矩阵尺寸较大时,可以按矩阵的输入方式编辑一个M文件(可用循环程序来做),在命令窗口直接执行该文件,即可将矩阵调入工作空间。 (3) 由函数创建矩阵: 对于一些特殊的矩阵,可以利用MATLAB的内部函数或用户自定义函数创建矩阵。如diag()函数可生成对角阵。 ones(m,n) ; zeros(m,n)(4) 通过数据文件创建矩阵: save 文件名 (其中,文件名是*.mat文件)load 文件名
3、 例:工作目录下有temp.mat文件,可以执行 load temp3. 复数矩阵表示(1) 复数表示 复数的虚根单位用i,j表示,即:z=3+4i或z=3+4j. 例如 输入 z=3+4i 输入z=3+4j得到: 得到:z = z = 3.0000 + 4.0000i 3.0000 + 4.0000i(2) 复数矩阵A=1 2;3 4+i*5 6;7 8 或者A=1+5i 2+6i;3+7i 4+8i,都得到:A = 1.0000 + 5.0000i 2.0000 + 6.0000i 3.0000 + 7.0000i 4.0000 + 8.0000i 二、MATLAB的变量和表达式1变量名命
4、名规则 J 可以是字母、数字或下划线,但第一个字符必须是字母。 J 长度=31 J 分辨大小写的,M和m是两个变量。 J 无须对变量的类型进行说明,当需要使用一个新变量时,只须直接对其赋值即可。 2表达式则是由运算符、函数调用、变量名以及特殊字符组成的式子。 3MATLAB中基本的赋值语句为: (1) 形式一:变量名=表达式将表达式的结果赋给变量名(表达式的运算结果都是一个矩阵)。 (2) 形式二:表达式计算表达式的值,将其值赋给MATLAB的永久变量ans。 上面两种形式,当表达式由分号“;”结束时,变量结果不显示。当表达式由逗号“,”或换行号结束,则将结果显示出来。 注:1)MATLAB中
5、有几个变量不能被clear清除,称永久变量。(其他变量名最好不要与此同)。即 ans:当不指明某一语句的计算结果赋给哪个变量时,系统自动将该计算结果赋给ans; eps:计算机能产生的绝对值最小的浮点数; i,j:虚数单位,即-1的平方根; inf,Inf:正无穷大; nan,NaN:非数,常产生于0/0等运算; Pi:圆周率。 2)如果表达式的值太复杂,一行写不下,可以加上三连点“”回车,然后接下去再写。如: s=1-1/2+1/3-1/4+1/5-1/6+1/7-1/8 +1/9-1/10+1/11-1/12; 3) 在MATLAB函数调用时,MATLAB还允许有这样的形式,如m,p=bo
6、de(n,d,w); 4字符串与字符串变量: MATLAB可将字符串当作数组或矩阵处理。在MATLAB中,字符串用单引号括起来,如: 例: S=Use Matlab 输出结果是: S= Use Matlab 字符串存储在行向量中,每个元素对应一个字符,向量的值为字符对应的ASCII码值。 2.2 MATLAB的初等运算一、矩阵运算符: A- 矩阵A的转置,如果A是复矩阵,则其运算结果是共轭转置; A+B-矩阵的加运算, A-B-矩阵的减运算, A*B-矩阵相乘,A的列数与B的行数相等,即A和B矩阵维数相容,维数不相容是不可乘的。如: A-n x m,B-m x r,若C=A*B,则:C-n x
7、 r。 B/A-方程X*A=B的解,即X=B*A-1。称矩阵的右除。 AB-方程A*X=B的解,即X=A-1*B。称矩阵的左除。 矩阵的除法,其意义相当于矩阵的求逆运算。左除与右除的关系为:b/a=(ab)。 AB-矩阵的乘方。 1)A为方阵,B为正整数时,表示矩阵A的B次乘积; 2)B为负整数时,表示矩阵A的逆阵的B次乘积; 3)B为非整数时,如B=n/m,则首先应该将A矩阵自乘n次,然后再对结果开m次方; 4)A、B均为矩阵时无意义。 A.*B-矩阵的点乘运算,表示A和B阵的对应元素直接相乘,A和B要有相同的维数。 点运算在MATLAB中起重要的作用,如X是一个向量,则求取X2时不能直接写
8、成X*X,而必须写成X.*X。 A.B,A./B-矩阵的点除运算,表示A和B阵的对应元素直接相除,A和B要有相同的维数。 A.B-矩阵的点乘方,表示要对其元素逐一进行幂运算。与点乘相似。 二、关系运算符: MATLAB中提供了6种关系运算符,用于比较两个同维数的矩阵: 小于 大于 = 大于或等于 = 等于 = 不等于 关系运算符可以用于检查矩阵的元素是否满足某些条件。两个同维数的矩阵比较的结果是与它们同维数的0、1矩阵,1表示结果为真,0表示结果为假。 三、逻辑运算符: 在MATLAB中,逻辑运算符有3种。 & 逻辑与。当运算双方对应元素都为非零时;结果为1,否则,结果为0。 | 逻辑或。 当
9、运算双方对应元素有一个为非零时;结果为1,否则,结果为0。 逻辑非。当元素的值为0时,结果为1,否则,结果为0。例:a=1 0 3;0 1 6,b=-1 0 0;0 5 0.3,计算两矩阵对应元素的逻辑关系。 a&b a|b a bans =1 0 00 1 1ans = 1 0 1 0 1 1ans = 0 1 0 1 0 0ans = 0 1 1 1 0 0四、特殊运算符: 在MATLAB中,有一些特殊的符号,具有特殊的意义。 1)在MATLAB的M文件中,可以加入解释行,解释行的标识符为:“%”,该符号后面的内容将作为注释内容。 2)行分隔符:“;” 用在MATLAB语句后,用它时执行结
10、果不显示,可避免显示一些不感兴趣的结果。3)冒号运算符“:” 最主要的作用是生成向量。如: j:k - 生成向量 j,j+1,j+2,k j:i:k - 生成向量 j,j+i,j+2i,j+3i,k (j为起始值,i为步距,k为终止值,在仿真中经常用于生成时间向量) A(:,j) - 矩阵A的第j列 A(i,:) - 矩阵A的第i行 A(j:k) - 生成向量A (A为向量时,为A的第j到第k个元素,当A为矩阵时,为A的按列数的第j到第k个元素) 例:A = 1 2 3 4 5 6 7 8 9 A(2:4) ans = 4 7 2 A(:,j:k) - 矩阵A的从第j列到第k列的矩阵子块 A(
11、:,j,k) -矩阵A的第j列和第k列 例:A = 1 2 3 4 5 6 7 8 9 A(:,1:2) ans = 1 2 4 5 7 8 A(:,1,3) ans = 1 3 4 6 7 9 4)MATLAB中允许对一个矩阵的单个元素进行赋值,如: A = 1 2 34 5 6 7 8 9 当执行A(2,3)=100,则显示: A = 1 2 34 5 100 7 8 9 注意:矩阵中元素按列存储,上例中对矩阵元素操作也可这样调用 A(8)=8 对于一个矩阵中0元素很多,而非0元素很少的情况,可以先形成0矩阵,然后将非0元素输入。 如果给出的行数和列数大于原矩阵范围,则将自动扩展原来的矩阵
12、,并将扩展后未赋值的矩阵元素置为0。如:A(4,5)=8A = 1 2 3 0 0 4 5 6 0 0 7 8 9 0 0 0 0 0 0 82.3 MATLAB语句 一、输入输出语句: MATLAB提供了一些输入和输出语句,允许用户和计算机之间进行数据交换。 1INPUT输入函数: 在编程时,如果想随时改变输入参数值,可采用input( )函数来进行输入,它的调用格式为: A=input(提示信息,选项); 提示信息可以是字符串显示,用它来提示输入的是什么样的数据,如: A=input(Enter matrix A = ) Enter matrix A = 1 2 3;4 5 6;7 8 9
13、 A =1 2 3 4 5 6 7 8 9 如果在input( )函数调用时采用了s选项,则允许用户输入字符串。如: A=input(Enter matrix A = ,s) Enter matrix A = matlab A = Matlab 2DISP输出函数: MATLAB提供的输出函数主要有disp( )函数,它的调用格式为: disp(A) 其中A既可以为字符串,也可以为矩阵3将数值转换成字符串输出: MATLAB还提供了较实用的字符串处理及转换函数,如: int2str( )函数可以方便地将一个整形数据转换成字符串形式,该函数的调用格式为: 例1: cstr=int2str(i)
14、例2: Inum=15; disp(The value of Inum is int2str(Inum), ! ok) The value of Inum is 15 ! ok注意:在矩阵中,每一个元素之间要有空格或逗号。 二、循环语句: MATLAB提供了两种循环方式:for-end循环和while-end循环。 1for循环语句: for循环语句为计数循环语句。如果要反复执行的一组语句的循环次数是已知的或预定义的,就可以使用for循环语句。它的基本格式为: for 循环变量=表达式1:表达式2:表达式3 循环语句组 end 上面的表达式1表示循环初值,表达式3表示循环终值,表达式2是步长,
15、该式相当于冒号表达式。当步长为1时,表达式2可省略。如: S1=1;S2=0.1;S3=10;for I=S1:S2:S3 X(I)=0 end 注:1)如果表达式3的值表达式1的值,语句仍是合法的,但MATLAB不执行循环内的语句; 2)for和end必须配对使用; 3)for语句还可以嵌套,但每一个for必须与一个end配对使用。如: m=3; n=4; for i=1:m for j=1:n A(i,j)=1/(i+j-1) end end 例题:求的值。程序为: mysum=0; for i=1:100 mysum=mysum+i; end disp(mysum) 2while循环语句
16、: while循环语句是条件循环语句,它的作用是在一定的逻辑条件控制下,不断地循环执行一条或一组语句,直到逻辑条件不再满足为止。适用于循环次数事先不知道的情况。它的基本结构 while 条件式 循环语句组 end它的执行方式是:若条件成立,则执行循环体,再判断表达式是否仍然成立,如不成立则跳出循环,向下执行。 如将上例改用while循环,则可写出下列程序: sum=0; i=1; while i10000的最小m。则程序为: mysum=0; for m=1:1000 if mysum10000, break; end mysum=mysum+m; end disp(m) 四、分支语句:swi
17、tch语句 switch语句可实现多分支的条件选择,在功能上与if-elseif-elseif-else结构相似。 switch 表达式 case 表达式1 语句组1 case 表达式2 语句组2 case 表达式n 语句组n otherwise 语句组 end 执行过程: switch后面表达式的值可以是数值变量或字符串变量,通过比较该值与case后面的值来决定执行哪部分。如与哪一个case的值相同就执行哪一个下面的语句组,如果与所有case的值都不同,则执行otherwise下面的语句组。Otherwise语句可以省略,如果省略otherwise,所有case都不满足时跳出分支结构。 Sw
18、itch与end必须配对使用。 例:如下的程序可以生成一个三对角矩阵: m=10; n=10; for k=1:mfor l=1:n switch abs(k-l) case 0 A(k,l)=1; case 1 A(k,l)=2; otherwise A(k,l)=0; end end end A 程序运行结果为:A= 1 2 0 0 0 0 0 0 0 0 2 1 2 0 0 0 0 0 0 0 0 2 1 2 0 0 0 0 0 0 0 0 2 1 2 0 0 0 0 0 0 0 0 2 1 2 0 0 0 0 0 0 0 0 2 1 2 0 0 0 0 0 0 0 0 2 1 2 0
19、0 0 0 0 0 0 0 2 1 2 0 0 0 0 0 0 0 0 2 1 2 0 0 0 0 0 0 0 0 2 1 五、检测语句:try-catch语句 检测语句try-catch主要用于检测错误并改变流程,其一般形式为: try 语句组1 catch 语句组2 end 执行方式:检测语句首先执行try下面的语句组1,如果没有错误,执行完成后跳出结构。如果执行语句组1时出现错误,则执行catch下面的语句组2。可以使用lasterr函数查询最后的错误信息,当查询结果为空字符串时,表示语句组1成功执行。 例:使用try-catch语句,判断错误语句。 在编辑器中编辑下列命令,判断错误语句
20、: n=4; a=magic(3) %产生3x3的魔方矩阵a try a_n=a(n,:) %取a的第n行元素 catch a_end=a(end,:) %如果取a的第n行出错,则改取a的最后一行 end lasterr %显示出错原因 该程序的执行结果为: a = 8 1 6 3 5 7 4 9 2 a_end = 4 9 2 ans = Index exceeds matrix dimensions 六、其它流程控制语句: 1continue语句: continue语句用于在for循环和while循环中跳过某些执行语句。 在for循环和while循环中,如果出现continue语句,则跳过
21、循环体中所有剩余的语句继续下一次循环,在嵌套循环中,continue控制执行本嵌套中的下一次循环。 例:使用continue语句,用于统计文件的行数。在编辑器中编辑下列命令: fid=fopen(magic.m,r) %打开magic.m文件 count=0; %计数器置零 while feof(fid); %判断是否是文件末尾 line=fgetl(fid); %从文件中读行 if isempty(line)|strncmp(line,%,1) %判断是否是空行或注释行 continue %如是空行或注释行继续下一次循环 end count=count+1; %计数器加1 end disp(
22、sprintf(%d lines,count); %显示行数(删除空行或注释行后) 2return语句: return语句用于终止当前的命令序列,并返回到调用的函数或键盘,也用于终止keyboard方式。 在MATLAB中,被调用的函数运行结束后会自动返回到调用函数,使用return语句时,将return插入被调函数的某一位置,根据某种条件迫使被调用函数提前结束并返回调用函数。 例:在编辑器中编辑下列函数,运行文件: function d=det(A) % det(A)为计算矩阵A的行列式函数 if isempty(A);d=1; return %如果矩阵是空的则返回调用函数 else . end 本次课习题: 计算下列表达式:1写出MATLAB命令窗口中的常用命令及功能。 4MATLAB对变量名称的规定如何?表达式如何构成? 5用多种方法输入以下矩阵,并赋值给变量a。 6计算以下表达式的值12+5*(7-4)32 。 7已知矩阵,求以下矩阵运算的结果: A=,B=求下列矩阵的结果(1) A*B(2)A.*B (3) A3*B (4)AB (5)A=B (6)A&zero