China-bub.coM 下载 第12章 MATLAB程序设计 MATLAB有一些命令可以来控制MATLAB语句的执行,如条件语句、循环语句和支持用 户交互的命令,本章将介绍这些命令。MATLAB是一种高级的程序设计语言,能帮助用户解 决矩阵问题或其他问题。那些熟悉其他编程语言的用户,如熟悉Pascal、C++、FORTRAN等, 对理解本章内容有一定的优势。但是确信这部分内容能够让所有的读者理解和掌握。 12.1条件控制语句 MATLAB中由if语句做出判断。If语句的基本格式如下: if logical expression statements end 注意,在if和logical expression(逻辑表达式)之间要有一个空格。statement(程序语句)可 以是一个命令,也可以是由逗号、分号隔开的若千命令或者是‘returns'。只有当逻辑表达式 为tre(真)时,才能执行这些命令。逻辑表达式可以是一个标量、一个向量或者一个矩阵。如 果逻辑表达式的所有元素为非零值,它才为true(。 1f语句也可以写成一行。 if logical expression,statements,end 当然,通常前一种形式使得MATLAB程序更加结构化和易读。 ■例12.1 假设定义m×n的矩阵A。下面的语句是判断矩阵A的第1列元素是否为0,若全为0,则从 矩阵A中删除第1列: 1fA(:,1)=0 A=A(1:m,2:n) end 或者写成一行: 1fA(:,1)=0,A=A(1:m,2:n),end ■ if语句可以与elseif或else组合起来用于更复杂的上下文语句中。可能有如下的结构存在: if logical expression statements 1 else statements 2 end 如果逻辑表达式为true,则执行statements 1中的命令语句:如果为false则执行statements2 中的语句。 考虑下面的1f语句:
下载 第1 2章 M AT L A B程序设计 M AT L A B有一些命令可以来控制 M AT L A B语句的执行,如条件语句、循环语句和支持用 户交互的命令,本章将介绍这些命令。 M AT L A B是一种高级的程序设计语言,能帮助用户解 决矩阵问题或其他问题。那些熟悉其他编程语言的用户,如熟悉 P a s c a l、C + +、F O RT R A N等, 对理解本章内容有一定的优势。但是确信这部分内容能够让所有的读者理解和掌握。 12.1 条件控制语句 M AT L A B中由i f语句做出判断。I f语句的基本格式如下: 注意,在i f和logical expre s s i o n(逻辑表达式)之间要有一个空格。 s t a t e m e n t(程序语句)可 以是一个命令,也可以是由逗号、分号隔开的若干命令或者是‘ r e t u r n s’。只有当逻辑表达式 为t r u e (真)时,才能执行这些命令。逻辑表达式可以是一个标量、一个向量或者一个矩阵。如 果逻辑表达式的所有元素为非零值,它才为 t r u e (。 i f语句也可以写成一行。 当然,通常前一种形式使得 M AT L A B程序更加结构化和易读。 ■ 例1 2 . 1 假设定义m×n的矩阵A。下面的语句是判断矩阵 A的第1列元素是否为0,若全为0,则从 矩阵A中删除第1列: 或者写成一行: i f语句可以与e l s e i f或e l s e组合起来用于更复杂的上下文语句中。可能有如下的结构存在: 如果逻辑表达式为t r u e , 则执行s t a t e m e n t s 1中的命令语句;如果为f a l s e则执行s t a t e m e n t s 2 中的语句。 考虑下面的i f语句: ■
166 MATLAB5手册 China-bub.coM 下载 if logical expression I statements 1 elseif logical expression 2 statements 2 end 当logical expression 1为true时,执行statements1中的命令:如果logical expression1为 false并且logical expression2为truel时,执行statements2。 注意,elseif必须写成一个单词,如果分开写成e1seif,将会被解释成不同的意思。 命令elseif不像else if一样需要一个额外的end。 另外1f语句可以被嵌套成下面的形式: if logical expression I statements I elseif logical expression 2 statements 2 else statements 3 end 更复杂的情况如下: if logical expression I statements 1 if logical expression 2 statements 2 else statements 3 end else statements 4 end ■例12.2 ()如果A为非奇异矩阵,就能解方程Ax-b:否则要取决于扩展矩阵(Ab)的梯形形式行的 个数。提示:如果一个矩阵是方阵或为满秩的,则它为非奇异矩阵。 号给出矩阵A和方程右边b。 s size(A) if(s(1)==s(2)&(rank(A)=s(1)) x =A\b else rref ([A b]) end (b)如果矩阵A的行列式为0,则计算特征值为0的个数: if det(A)==0 length(find(eig(A)==0)) end ■
当logical expre s s i o n 1为t r u e时,执行s t a t e m e n t s 1中的命令;如果logical expre s s i o n 1为 f a l s e并且 logical expre s s i o n 2为t r u e时,执行s t a t e m e n t s 2。 注意,e l s e i f必须写成一个单词,如果分开写成 else if,将会被解释成不同的意思。 命令e l s e i f不像else if一样需要一个额外的e n d。 另外i f语句可以被嵌套成下面的形式: 更复杂的情况如下: ■ 例1 2 . 2 (a) 如果A为非奇异矩阵,就能解方程 A x = b;否则要取决于扩展矩阵(A b)的梯形形式行的 个数。提示:如果一个矩阵是方阵或为满秩的,则它为非奇异矩阵。 % 给出矩阵A和方程右边b。 (b) 如果矩阵A的行列式为0,则计算特征值为0的个数: 1 6 6 M ATLAB 5 手册 下载 ■
China-pub.CoM 第I2章MATLAB程序设计 167 下载 另一种条件语句是switch-case语句,如下: switch logical expression (scalar or string) case value 1 expression I case value 2 expression 2 ,,+ otherwise expression end logical expression经过计算给出一个标量或字符串作为结果。将这个结果与alue1,aue2,.进行比较, 如果它们匹配,则执行相应ase下的语句xpression。如果没有匹配的,则执行herwise下的语句。 如果expression的结果是一个标量,将通过检查:expression==value来决定执行的表达式。 如果表达式的结果是一个字符串,那么用strcmp(expression,value)来检查。测试结果为真, 则执行相应的表达式,而其他case语句中的表达式将不会被执行。 通过将不同的值放入细胞矩阵,就能用case语句与不同的值进行比较:见例12.3。 ■例12.3 检测掷一次骰子所得的点数是单数还是双数: function dicetest(result) switch result case{1,3,5] disp('odd number of eyes') case[2,4,6] disp('even number of eyes') otherwise disp('What kind of dice do you have?') 运行这个函数可以得到如下结果: dicetest(1) odd number of eyes dicetest(4) even number of eyes dicetest(7) What kind of dice do you have? ■ 如果表达式出错,可以使用try/catch组合,其形式如下: try expression I catch expression 2 end
另一种条件语句是s w i t c h - c a s e语句,如下: logical expre s s i o n经过计算给出一个标量或字符串作为结果。将这个结果与v a l u e1, value 2, ...进行比较, 如果它们匹配,则执行相应的c a s e下的语句e x p re s s i o n。如果没有匹配的,则执行o t h e r w i s e下的语句。 如果e x p re s s i o n的结果是一个标量,将通过检查:e x p re s s i o n= =v a l u e来决定执行的表达式。 如果表达式的结果是一个字符串,那么用 s t r c m p(e x p ression, value)来检查。测试结果为真, 则执行相应的表达式,而其他 c a s e语句中的表达式将不会被执行。 通过将不同的值放入细胞矩阵,就能用 c a s e语句与不同的值进行比较;见例 1 2 . 3。 ■ 例1 2 . 3 检测掷一次骰子所得的点数是单数还是双数: 运行这个函数可以得到如下结果: 如果表达式出错,可以使用 t r y / c a t c h组合,其形式如下: 第1 2章 M AT L A B程序设计 1 6 7 下载 ■
168 MATLAB5手册 China-pub.com 下载 MATLAB开始执行expression1,但如果有错误,错误信息将被存储在lasterr中,并且 执行expression2。 12.2 循环语句 MATLAB有两个命令for和while能反复执行语句。在逻辑控制下,这些命令能灵活地一次 或多次执行语句。 命令for与大多数的程序设计语言中的do或for命令一样。这个命令就是反复执行一条 语句或一组语句,而执行的次数已预先定义好。以end结束这组语句。 for循环通常的语法为: for variable expression statements end 象if语句一样,for语句也能写在一行上: for variable expression,statements,end 在for和variable之间需要有一个空格。这里的variable是循环变量名。在表达式中给出循 环的初始值、步长和终值。这个步长可为负数或单位值。如果为单位值,循环变量每次迭代 将增加1。通常我们用冒号来定义expression,例如i:j:k或i:j,参见4.3节。 表达式中的列值被一个一个地存放在循环变量中。因此,可以用一个矩阵来代替表达式。 例如下面的语句: for v =A,...,end 就等价于: for j=1:n,v=A(:,j);...,end 当表达式用冒号来表示时,那么列值都是标量,例如MATLAB中的语句:forv=i:j:k。 循环是可以嵌套的: for variable I =expression A statements 1 for variable II =expression B statements 2 end statements 3 end ■例12.4 (a)下列矩阵有三个非零对角值(这是一个三对角阵): 100 0 5 10 0 0 15 0 0 0151 0 0015 这个矩阵可循环使用命令£ox来创建。这种方法在任何标准的程序设计语言中都是一样的
M AT L A B开始执行e x p re s s i o n 1,但如果有错误,错误信息将被存储在 l a s t e r r中,并且 执行e x p re s s i o n 2。 12.2 循环语句 M AT L A B有两个命令f o r和w h i l e能反复执行语句。在逻辑控制下,这些命令能灵活地一次 或多次执行语句。 命令f o r与大多数的程序设计语言中的 d o或f o r命令一样。这个命令就是反复执行一条 语句或一组语句,而执行的次数已预先定义好。以 e n d结束这组语句。 f o r循环通常的语法为: 象i f语句一样,f o r语句也能写在一行上: 在f o r和v a r i a b l e之间需要有一个空格。这里的 v a r i a b l e是循环变量名。在表达式中给出循 环的初始值、步长和终值。这个步长可为负数或单位值。如果为单位值,循环变量每次迭代 将增加1。通常我们用冒号来定义e x p re s s i o n,例如i : j : k或i : j,参见4 . 3节 。 表达式中的列值被一个一个地存放在循环变量中。因此,可以用一个矩阵来代替表达式。 例如下面的语句: 就等价于: 当表达式用冒号来表示时,那么列值都是标量,例如M AT L A B中的语句:for v=i:j: k。 循环是可以嵌套的: ■ 例1 2 . 4 (a) 下列矩阵有三个非零对角值 (这是一个三对角阵) : 这个矩阵可循环使用命令f o r来创建。这种方法在任何标准的程序设计语言中都是一样的。 1 6 8 M ATLAB 5 手册 下载
China-pub.CoM 第I2章MATLAB程序设计 169 下载 A=[门; for k 1:5 for j=1:5 if k =j A(k,k)=5; elseif abs(k-j)==1 A(k,j)=1; else A(k,j=; end end end 这里的分号’;是非常重要的。如果这些赋值语句没有分号,矩阵A将在屏幕上输出25次, 每一次A中的元素将被赋值一次。 同样也会遇见由于不注意使用£。r循环而导致无效操作的例子。通过定时器时钟就能清 楚地计算出花费的时间。例如,for循环,见例12.21。下面的命令能完成上面同样的事情, 并且更加有效: A zeros(5); for k 1:4 A(k,k)=5; A(k,k+1)=1; A(k+1,k)=1; end A(5,5)=5; 这个矩阵能通过更加快速有效的方法得到,但是使用命令diag更加清楚。 A=门; A diag(5*ones(5,1))+diag(ones(4,1),1)+... diag(ones(4,1),-1); 这种结构的大矩阵应该创建成稀疏矩阵:参见第9章。 (b)在区间[一2,一0.75]内,步长为0.25,对函数=fx)=1+1/x求值,并列表。将所得x值和 y值分别存入向量r和s中,并列表显示: r=门;8=[门; forx=-2.0:0.25:-0.75 y=1+1/x; r=[r x]; 8=[sy]; end [r;s]
这里的分号’ ; ’是非常重要的。如果这些赋值语句没有分号,矩阵 A将在屏幕上输出 2 5次, 每一次A中的元素将被赋值一次。 同样也会遇见由于不注意使用 f o r循环而导致无效操作的例子。通过定时器时钟就能清 楚地计算出花费的时间。例如, f o r循环,见例 1 2 . 2 1。下面的命令能完成上面同样的事情, 并且更加有效: 这个矩阵能通过更加快速有效的方法得到,但是使用命令 d i a g更加清楚。 这种结构的大矩阵应该创建成稀疏矩阵;参见第 9章。 (b) 在区间[-2 ,-0 . 7 5 ]内,步长为0 . 2 5,对函数y=f(x) = 1 + 1 /x求值,并列表。将所得 x值和 y值分别存入向量r和s中,并列表显示: 第1 2章 M AT L A B程序设计 1 6 9 下载