MATLAB系列03:分支语句和编程设计
MATLAB系列03:分支语句和编程设计
- 3. 分支语句和编程设计
- 3.1 自上而下的编程方法简介
- 3.2 伪代码的应用
- 3.3 关系运算符和逻辑运算符
- 3.3.1 关系运算符
- 3.3.2 小心==和~=运算符
- 3.3.3 逻辑运算符
- 3.3.4 逻辑函数
- 3.4 选择结构
- 3.4.1 if结构
- 3.4.2 switch结构
- 3.4.3 try/catch结构的应用
- 3.5 附加的画图特性
- 3.5.1 控制x,y轴绘图的上下限
- 3.5.2 在同一坐标系内画出多个图像
- 3.5.3 创建多个图像
- 3.5.4 子图像
- 3.5.5 对画线的增强控制
- 3.5.6 文本字符串的高级控制
- 3.5.7 极坐标图像
- 3.5.8 注释并保存图像
- 3.6 总结
3. 分支语句和编程设计
MATLAB语句有两大类控制顺序结构:
- 选择结构,用于选择执行特定的语句
- 循环结构,用于重复执行特定的代码
3.1 自上而下的编程方法简介
所谓的自顶向下的编程方法,本质上就是编写程序的视角从整体的宏观性逐层进入具体的微观性的一种编程思想。我们编写程序时一开始不用思考得事无巨细,把所有细节都想清楚;也不要面条式的想到哪里写到哪里。而应该是自顶向下的,从一个大的粗的核心的任务开始,逐级细分,最后再完成最底层的具体实现。
程序设计的基本步骤:
- 清晰地陈述出你要解决的问题。
- 确定程序所需地输入量和程序所产生的输出量。
- 为你的程序设计算法
- 将算法转化为 MATLAB 语句
- 调试MATLAB语句
3.2 伪代码的应用
伪代码是 MATLAB 和英语的混合体。和MATLAB 一样,它是结构化的,一行表达一个明确的意思或代码的片段,但每一行的描述用的是英语或其他人类语言。伪代码的每一行都应用普通简单且易于理解的英语或中文描述。因为修改简单灵活,所以伪代码在开发算法的过程中非常的有用。
3.3 关系运算符和逻辑运算符
MATLAB 把 0 值作为结果 false,把所有的非 0 值作为结果 ture。
3.3.1 关系运算符
关系运算符是指两数值或字符操作数的运算符,这种运算将会根椐两操作数的关系产生结果 true 或 false。关系运算的基本形式如下
a
1
o
p
a
2
a_1\,op\,a_2
a1opa2
关系运算符也可用于标量和数组的比较,示例
>> a=[1 0;-2 1];
>> b=0;
>> a>b
ans =
2×2 logical 数组
1 0
0 1
注意因为字符串实际上是字符的数组,关系运算符也比较两个相同长度的字符串。如果它们有不同的长度,比较运算将会产生一个错误。
编程隐患:
不要混淆关系运算符(==)和赋值运算符(=)
3.3.2 小心==和~=运算符
等于运算符(==)如果两变量值相同将会返回变量值 1,如果不同将返回 0。不等运算符(~=)如果两变量值不同则返回 1,相则返回 0。用这两个运算符比较两个字符串他是安全的,不会出现错误。但对两个数字数据的比较,将可能产生异想不到的错误。两个理论上相等的数不能有一丝一毫的差别,而在计算机计算的过程中存在修正误差,从而可能在判断相等与不相等的过程中产生错误, 这种错误叫做round off 错误。例如
>> a=0;
>> b=sin(pi);
>> a==b
ans =
logical
0
因此在检测两数值是否相等时,要考虑是否由于修正误差可能会使两个本来应该相等的值不相等了。这时可以在修正误差的范围内,判断它们是否近似相等。
3.3.3 逻辑运算符
标量和数组,数组和数组之间都可以进行逻辑运算,示例:
>> a=[1 0;0 1];
>> b=0;
>> a & b
ans =
2×2 logical 数组
0 0
0 0
>> b=[1 1 ;0 0];
>> a|b
ans =
2×2 logical 数组
1 1
0 1
如果两个数组大小不相同,会产生运行时错误。
在运算顺序中,逻辑运算在所有的数学运算和关系运算之后进行
3.3.4 逻辑函数
3.4 选择结构
MATLAB的选择结构有:if结构,switch结构和try/catch结构
3.4.1 if结构
基本形式如下
if control_expr_1
Statement 1
Statement 2
elseif control_expr_2
Statement 1
Statement 2
else
Statement 1
Statement 2
end
在一个 if 结构中, 可以有任意个 elseif 语句, 但 else 语句最多有一个。 只要上面每一个控制表达式均为 0, 那么下一个控制表达式将会被检测。 一旦其中的一个表达式的值非 0,对应的语句块就要被执行, 然后跳到 end 后面的第一个可执行语句继续执行。 如果所有的控制表达式均为 0, 那么程序将会执行 else 语句。 如果没有 else 语句, 程序将会执行 end 后面的语句, 而不执行 if 结构中的部分。
示例:
a=2;
b=1;
c=-2;
if (b^2 - 4*a*c) < 0
disp('This equation has two complex roots.');
elseif (b^2 - 4*a*c) == 0
disp('This equation has two identical real roots.');
else
disp('This equation has two distinct real roots.');
end
This equation has two distinct real roots.
3.4.2 switch结构
switch 结构是另一种形式的选择结构。 程序员可以根据一个单精度整形数, 字符或逻辑表达式的值来选择执行特定的代码语句块。 基本形式如下:
switch (switch_expr)
case case_expr_1
Statement 1
Statement 2
case case_expr_2
Statement 1
Statement 2
otherwise
Statement 1
Statement 2
end
如果 switch_expr 的值与 case_expr_1 相符, 那么第一个代码块将会被执行, 然后程序将会跳到 switch 结构后的第一个语句。 如果 switch_expr 的值与 case_expr_2 相符, 那么第二个代码块将会被执行, 然后程序将会跳到 switch 结构后的第一个语句。 在这个结构中, 用相同的方法来对待其他的情况。 otherwise 语句块是可选的。 如果它存在的话, 当 switch_expr的值与其他所有的选项都不相符时, 这个语句块将会被执行。 如果它不存在, 且 witch_expr的值与其他所有的选项都不相符, 那么这个结构中的任何一个语句块都不会被执行。
示例:
value=1;
switch (value)
case {1, 3, 5, 7, 9}
disp('The value is odd.');
case {2, 4, 6, 8, 10}
disp('The value is even.');
otherwise
disp('The value is out of range.');
end
3.4.3 try/catch结构的应用
try/catch 结构是选择结构的一种特殊形式, 用于捕捉错误。 一般地, 当一个 MATLAB 程序在运行时遇到了一个错误, 这个程序就会中止执行。 try/catch 结构修改了这个默认行为。如果一个错误发生在这个结构的 try 语句块中, 那么程序将会执行 catch 语句块, 程序将不会中断。 它将帮助程序员控制程序中的错误, 而不用使程序中断。结构的基本形式如下:
try
Statement 1
Statement 2
catch
Statement 1
Statement 2
end
示例:
% Initialize array
a = [ 1 -3 2 5];
try
% Try to display an element
index = input('Enter subscript of element to display: ');
disp(['a(' int2str(index) ') = ' num2str(a(index))] );
catch
% If we get here an error occurred
disp( ['Illegal subscript: ' int2str(index)] );
end
Enter subscript of element to display: 8
Illegal subscript: 8
3.5 附加的画图特性
3.5.1 控制x,y轴绘图的上下限
axis命令或函数允许程序员设定和修改坐标的上下限。
示例:
x=-2*pi:pi/20:2*pi;
y=sin(x);
plot(x,y);
title('Plot of sin(x) vs x');
修改上下限:
axis([0 pi 0 1])
3.5.2 在同一坐标系内画出多个图像
在一般情况下,创建一个新的图象就要用到一个 plot 命令,前面的数据就会自动消失。这种行为可以通过使用 hold 命令得到修改。当 hold on 命令执行后,所有的新的图象都会叠加在原来存在的图象。hold off 命令可恢复默认情况,用新的图象来替代原来的图象。
x = -pi:pi/20:pi;
y1 = sin(x);
y2 = cos(x);
plot(x,y1,'b-');
hold on;
plot(x,y2,'k--');
hold off;
legend ('sin x','cos x');
3.5.3 创建多个图像
MATLAB 可以创建多个图象窗口, 每个窗口都有不同的数据。 我们用图象数来区分这些图象窗口, 图象数是一个小的正整数。 第一个图象窗口称为图 1, 第二个图象窗口为图 2,依次类推。 这些窗口中的一个称为当前图象窗口, 所有的新的画图命令将会展示在那个窗口中。gcf 函数用于当于返回当前图象数。 当你需要知道当前图象数时, 你就把这个函数写入M 文件中。
figure(1);
x = 0:0.05:2;
y1 = exp(x);
plot(x,y1);
figure(2);
y2 = exp(-x);
plot(x,y2);
3.5.4 子图像
创建子图像的命令
subplot(m,n,p)
该命令在当前窗口创建 m × n m\times n m×n个子图像,按m行,n列排列,并选择子图像p来接收当前命令。子图像从左到右,从上到下排列。
figure(1);
subplot(2,1,1);
x = -pi:pi/20:pi;
y = sin(x);
plot(x,y);
title('Subplot 1 title');
subplot(2,1,2);
x = -pi:pi/20:pi;
y = cos(x);
plot(x,y);
title('Subplot 2 title');
3.5.5 对画线的增强控制
除了控制画线的颜色、样式和符号形式,我们还可以设置其中四种附加属性。
x=0:pi/15:4*pi;
y=exp(2*sin(x));
plot(x,y,'-ko','LineWidth',3.0,'Markersize',6 ,...
'MarkerEdgeColor','r','MarkerFaceColor','g');
3.5.6 文本字符串的高级控制
文本的字体通可以通过流修饰符(stream modifiers)修改。 一个流修饰符是一个特殊的字符序列, 用来告诉编译器改变它的行为。 最普通的流修饰符是:
特殊的希腊字母或数学符号也可用在文本字符串中。 通过嵌入特殊的转义序列来创建这些字符。 这些转义序列是支持 TEX 语言的特殊序列的一个子集。 如果要打印转义符\, {, }, _, 或^就必须在前面加上一个反斜杠。
3.5.7 极坐标图像
MATLAB 中包括一个重要的函数叫做 polar, 它用于在极坐标系中画图。 这个函数的基本形式如下:
polarplot(theta,r)
其是 theta 代表一个弧度角数组, r 代表一个距离数组。 它用来画以角度为自变量的函数的极坐标图是非常有用的。
3.5.8 注释并保存图像
一旦 MATLAB 成功创建一个图象, 那么用户就可以运用画图工具条上的 GUI 工具来编辑和注释这些图象。