3.3.4 逻辑函数
MATLAB中有大量的逻辑函数,在条件满足时,函数返回1。条件不满足时,返回0。这些函数和逻辑运算与关系联合在组成选择结构和循环结构。表3.4列出了一系列的逻辑函数。
表3.4 MATLAB逻辑函数 | 函数 | 用途 | ischar(a) | a是字符数组返回1,否则返回0 | isempty(a) | a是空数组返回1,否则返回0 | isinf(a) | a是无穷大,则返回1,否则返回0 | isnan(a) | a不是一个数则返1,否则返回0 | isnumeric(a) | a是一个数值数组返回1,否则返回0 |
测试3.1
本测试提供了一个快速的检查方式,看你是否掌握了3.3的基本内容。如果你对本测试有疑问,你可以重读3.3,问你的老师,或和同学们一起讨论。在附录B中可以找到本测试的答案。
变量a,b,c,d定义如下,计算后面的表达式。
a = 20; b = -2;
c = 0; d = 1;
1. a > b 2. b > d;
3. a > b & c > d 4.a == b
5. a & b > c 6.~~b
变量a,b,c,d定义如下,计算后面的表达式。
a = 2; b=
c = d =
7. ~(a > b);
8. a > c & b > c;
9. c <= d
变量a,b,c,d定义如下,计算后面的表达式。
a = 2; b= 3;
c = 10; d= 0;
10. a*b^2 > a*c
11. d | b b > a
12. (d | b) > a
变量a,b,c,d定义如下,计算后面的表达式。
a = 20; b= -2;
c = 0; d= 'Test';
13. isinf(a/b)
14. isinf(a/c)
15. a > b & ischar(d)
16. isempty(c)
3.4 选择结构(分支语句)
选择结构可以使MATLAB选择性执行指定区域内的代码(称之为语句块blocks),而跳过其他区域的代码。选择结构在MATLAB中有三种具体的形式:if结构,switch结构和try/catch结构。
3.4.1 if结构
if结构的基本形式如下:
if control_expr_1
elseif control_expr_2
else
end
其中control expression控制if结构的运算。如果control_expr_1的值非0,那么程序将会执行语句块1(block1),然后跳到end后面的第一个可执行语句继续执行。否则,程序将会检测control_expr_2的值,。如果control_expr_2的值非0,那么程序将会执行语句块2(block2),然后跳到end后面的第一个可执行语句继续执行。如果所有的控制表达式(control expression)均为0,那么程序将会执行与else相关的语句块。
在一个if结构中,可以有任意个elseif语句,但else语句最多有一个。只要上面每一个控制表达式均为0,那么下一个控制表达式将会被检测。一旦其中的一个表达式的值非0,对应的语句块就要被执行,然后跳到end后面的第一个可执行语句继续执行。如果所有的控制表达式(controlexpression)均为0,那么程序将会执行else语句。如果没有else语句,程序将会执行end后面的语句,而不执行if结构中的部分。
注意MATLAB在if结构中的关键字end与第二章中提到的返回已知下标最大值函数end完全不同。matlab通过end在M文件中的上下文来区分开它的两个用途。在大多数情况下,控制表达式均可以联合关系运算符和逻辑运算符。正像我们在本章早些时侯学到的,当对应的条件为真时,关系运算和逻辑运算将会产生1,否则产生0。所以当一个运算条件为真时,运算结果为非0,则对应的语句块,就会被执行。
例如,一元二次方程的基本形式如下:
ax2 + bx + c = 0 (3.1)
其解为
(3.2)
其中b2 - 4ac是我们熟知的判别式,当b2 - 4ac>0时,方程式有两个不同的实数根,当b2 - 4ac=0,有两个相同的实数根,当b2 - 4ac<0时,方程式有两个不同的复根。
假设我们检测某一元二次根的情况,并告诉使用者这个方程有两个复根,还是两个相等的实根和两个不相等的实根。用伪代码这个结构的形式如下:
if (b^2 - 4*a*c) < 0
Write msg that equation hastwo complex roots.
elseif (b^2 - 4*a*c) ==0
Write msg that equation hastwo identical real roots.
else
Write msg that equation hastwo distinct real roots.
end
转化为MATLAB语言:
if (b^2 - 4*a*c) < 0
disp('This equation has twocomplex roots.');
elseif (b^2 - 4*a*c) == 0
disp('This equation has twoidentical real roots.');
else
disp('This equation has twodistinct real roots.');
end
回忆一下,判断为真时,关系运算符将会返回一个非0值,从而导致对应语句的执行。
为增加程序的可读性,在if结构中的语句块中最好缩进2到3个空格,而实际上没有必要。
好的编程习惯
if结构体经常缩进2到3个空格,以增强程序的可读性。
你可以在一行内写完一个完整的if结构,只需把结构的每一部分后面加上
分号或逗号,所以下面的两个结构是等价的:
if x < 0
y = abs(x);
end
和
if x < 0; y = abs(x); end
但是这种方式只适用于简单的结构。
|