第5章关系和逻辑运算 除了传统的数学运算,MA∏LAB支持关系和逻辑运算。如果你已经有了一些编程经验 就会对这些运算熟悉。这些操作符和函数的目的是提供求解真/假命题的答案。一个重要的 应用是控制基于真假命题的一系列 MATLA B命令(通常在M文件中)的流程,或执行次 作为所有关系和逻辑表达式的输入, MATLAB把任何非零数值当作真,把零当作假 所有关系和逻辑表达式的输出,对于真,输出为1:对于假,输出为零。 5.1关系操作符 MATLAB关系操作符包括所有常用的比较。 表5 关系操作符 说明 小于 小于或等于 大于 大于或等于 等于 不等于 MATLAB关系操作符能用来比较两个同样大小的数组,或用来比较一个数组和一个标量 在后一种情况,标量和数组中的每一个元素相比较,结果与数组大小一样。下面给出几个示 A=1:9,B=9-A >) tf=A>4 tf 00001 找出A中大于4的元素。0出现在A4的地方
第 5 章 关系和逻辑运算 除了传统的数学运算,MATLAB 支持关系和逻辑运算。如果你已经有了一些编程经验, 就会对这些运算熟悉。这些操作符和函数的目的是提供求解真/假命题的答案。一个重要的 应用是控制基于真/假命题的一系列 MATLAB 命令(通常在 M 文件中)的流程,或执行次 序。 作为所有关系和逻辑表达式的输入,MATLAB 把任何非零数值当作真,把零当作假。 所有关系和逻辑表达式的输出,对于真,输出为 1;对于假,输出为零。 5.1 关系操作符 MATLAB 关系操作符包括所有常用的比较。 表 5.1 关系操作符 说明 大于 > = 大于或等于 = = 等于 ~ = 不等于 MATLAB 关系操作符能用来比较两个同样大小的数组,或用来比较一个数组和一个标量。 在后一种情况,标量和数组中的每一个元素相比较,结果与数组大小一样。下面给出几个示 例: » A=1:9, B=9-A A = 1 2 3 4 5 6 7 8 9 B = 8 7 6 5 4 3 2 1 0 » tf=A>4 tf = 0 0 0 0 1 1 1 1 1 找出 A 中大于 4 的元素。0 出现在 A4 的地方
>tf(A==B) 00 找出A中的元素等于B中的元素。注意,和=意味着两种不同的事:==比较两个 变量,当它们相等时返回1,当它们不相等时返回0;在另一方面,=被用来将运算的结果 赋给一个变量 t=B-(A>2) 找出A>2,并从B中减去所求得的结果向量。这个例子说明,由于逻辑运算的输出是1 和0的数组,它们也能用在数学运算中 >)B=B+(B==0)*eps Columns I through 7 8.0000700 6.00005.00004.00003.00002.0000 Columns 8 through 9 1.00000.0000 这是一个演示,表明如何用特殊的 MATLAB数eps来代替在一个数组中的零元素,eps 近似为22e-16。这种特殊的表达式在避免被0除时是很有用的。 x=(-3:3)/3 -1.0 -0.6667-0.3333 00.33330.66671.0000 >)sin(x)./x Warning: Divide by zero 0.84150.92760.9816 NaN0.98160.92760.8415 由于第四个数据是0,计算函数sin(x)x时给出了一个警告。由于sin(0)/0是没定义的 在该处 MATLAB结果返回NaN。用eps替代0以后,再试一次, x=x+(x==0)*eps, >)sin(x)./x 0.8415092760.98161.00000.98160.92760.8415
» tf=(A= =B) tf = 0 0 0 0 0 0 0 0 0 找出 A 中的元素等于 B 中的元素。注意,=和= =意味着两种不同的事:= = 比较两个 变量,当它们相等时返回 1,当它们不相等时返回 0;在另一方面, = 被用来将运算的结果 赋给一个变量。 » tf=B-(A>2) tf = 8 7 5 4 3 2 1 0 -1 找出 A>2,并从 B 中减去所求得的结果向量。这个例子说明,由于逻辑运算的输出是 1 和 0 的数组,它们也能用在数学运算中。 » B=B+(B==0)*eps B = Columns 1 through 7 8.0000 7.0000 6.0000 5.0000 4.0000 3.0000 2.0000 Columns 8 through 9 1.0000 0.0000 这是一个演示,表明如何用特殊的 MATLAB 数 eps 来代替在一个数组中的零元素,eps 近似为 2.2e-16。这种特殊的表达式在避免被 0 除时是很有用的。 » x=(-3:3)/3 x = -1.0000 -0.6667 -0.3333 0 0.3333 0.6667 1.0000 » sin(x)./x Warning: Divide by zero ans = 0.8415 0.9276 0.9816 NaN 0.9816 0.9276 0.8415 由于第四个数据是 0 ,计算函数 sin(x)/x 时给出了一个警告。由于 sin(0)/0 是没定义的, 在该处 MATLAB 结果返回 NaN。用 eps 替代 0 以后,再试一次, » x=x+(x==0)*eps; » sin(x)./x ans = 0.8415 0.9276 0.9816 1.0000 0.9816 0.9276 0.8415
现在sin(x)x在x=0处给出了正确的极限 5.2逻辑操作符 逻辑操作符提供了一种组合或否定关系表达式。 MATLAB逻辑操作符包括: 表52 逻辑操作符 说明 与 或 非 逻辑操作符用法的一些例子有 》A=1:9;B=9-A o tf=A>4 tf 0 找出A大于4 )tf(A>4 0 对上面的结果取非,也就是1替换0,0替换1。 tf=(A>2)&(A)xlinspace(0, 10, 100); create data compute sine set negative values of sin(x)to zero z=z+0.5*(y<0) where sin(x)is negative add 1/2 》z=(X<=8).*z set values past x=8 to zero
现在 sin(x)/x 在 x=0 处给出了正确的极限。 5.2 逻辑操作符 逻辑操作符提供了一种组合或否定关系表达式。MATLAB 逻辑操作符包括: 表 5.2 逻辑操作符 说明 & 与 | 或 ~ 非 逻辑操作符用法的一些例子有: » A=1:9;B=9-A; » tf=A>4 tf = 0 0 0 0 1 1 1 1 1 找出 A 大于 4。 » tf=~(A>4) tf = 1 1 1 1 0 0 0 0 0 对上面的结果取非,也就是 1 替换 0,0 替换 1。 » tf=(A>2)&(A=0).*y ; % set negative values of sin(x) to zero » z=z+0.5*(y<0) ; % where sin(x) is negative add 1/2 » z=(x<=8).*z ; % set values past x=8 to zero
>plot(x, z) >)xlabel( x), ylabel(z=f(x)), title(' A Discontinuous Signal) A Discontinuous Signal 图5.1不连续信号 5.3关系与逻辑函数 除了上面的关系与逻辑操作符, MATLAB提供了大量的其他关系与逻辑函数,包括 表5.3 其他关系与逻辑函数 xor(xy)异或运算。ⅹ或y非零(真)返回1,x和y都是零(假)或都是非零(真)返回0。 any(x)如果在一个向量x中,任何元素是非零,返回1;矩阵x中的每一列有非零 元素,返回1。 ax)如果在一个向量x中,所有元素非零,返回1:矩阵x中的每一列所有元素 非零,返回1 除了这些函数,MA∏LAB还提供了大量的函数,测试特殊值或条件的存在,返回逻辑 表54 测试函数
» plot(x, z) » xlabel(' x '), ylabel(' z=f(x) '), title(' A Discontinuous Signal ') 0 2 4 6 8 10 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 x z=f(x) A Discontinuous Signal 图 5.1 不连续信号 5.3 关系与逻辑函数 除了上面的关系与逻辑操作符,MATLAB 提供了大量的其他关系与逻辑函数,包括: 表 5.3 其 他 关 系 与 逻 辑 函 数 xor(x,y) 异或运算。x 或 y 非零(真)返回 1,x 和 y 都是零(假)或都是非零(真)返回 0。 any(x) 如果在一个向量 x 中,任何元素是非零,返回 1;矩阵 x 中的每一列有非零 元素,返回 1。 all(x) 如果在一个向量 x 中,所有元素非零,返回 1;矩阵 x 中的每一列所有元素 非零,返回 1。 除了这些函数,MATLAB 还提供了大量的函数,测试特殊值或条件的存在,返回逻辑 值。 表 5.4 测 试 函 数
finite 元素有限,返回真值。 参量为空,返回真值。 参量是一个全局变量,返回真值。 当前绘图保持状态是‘ON’,返回真值 Isieee 计算机执行IEEE算术运算,返回真值 isin 元素无穷大,返回真值 isletter 元素为字母,返回真值。 Ishan 元素为不定值,返回真值。 isreal 参量无虚部,返回真值。 元素为空格字符,返回真值 参量为一个字符串,返回真值。 student MATLAB为学生版,返回真值 计算机为UNIX系统,返回真值 计算机为VMS系统,返回真值。 5.4NaNs和空矩阵 NaNs和空矩阵([]要求在 MATLAB中作特殊处理,特别是用在逻辑或关系表达式里 根据IEEE数学标准,对NaNs的几乎所有运算都得出NaNs。例如 >)a=[l 2 nan inf nan] note, in use, NaN can be lowercase 2 Nan Inf NaN 2 4 Nan Inf NaN 》c= sqrt(a) 1.000014142 >f=(a=nan)
finite 元素有限,返回真值。 isempty 参量为空,返回真值。 isglobal 参量是一个全局变量,返回真值。 ishold 当前绘图保持状态是‘ON’,返回真值。 isieee 计算机执行 IEEE 算术运算,返回真值。 isinf 元素无穷大,返回真值。 isletter 元素为字母,返回真值。 isnan 元素为不定值,返回真值。 isreal 参量无虚部,返回真值。 isspace 元素为空格字符,返回真值。 isstr 参量为一个字符串,返回真值。 isstudent MATLAB 为学生版,返回真值。 isunix 计算机为 UNIX 系统,返回真值。 isvms 计算机为 VMS 系统,返回真值。 5.4 NaNs 和空矩阵 NaNs 和空矩阵([ ])要求在 MATLAB 中作特殊处理,特别是用在逻辑或关系表达式里。 根据 IEEE 数学标准,对 NaNs 的几乎所有运算都得出 NaNs。例如, » a=[1 2 nan inf nan] % note,in use, NaN can be lowercase a = 1 2 NaN Inf NaN » b=2*a b = 2 4 NaN Inf NaN » c=sqrt(a) c = 1.0000 1.4142 NaN Inf NaN » d = (a= =nan) d = 0 0 0 0 0 » f = (a~ =nan) f = 1 1 1 1 1
上面的第一和第二计算式对NaN输入给出NaN结果。然而,最后两个计算式产生有点 令人惊讶的结果。当NaN与NaN相比较时,(a==nan)产生全部为0或假的结果,同时(a =nan)产生全部1或真值。于是,单个NaNs相互不相等。由于NaNs的这种特性, MATLAB 有一个内置逻辑函数寻找NaNs 》g= Isnan(a) 0 0 这个函数用find命令能找出NaNs的下标值。例如, >)Find( isnan(a)) find indices of NaNs >a(i=zeros(size(D)) changes nans in a to zeros 0 Inf 当NaNs数学上由IEEE标准充分定义时,空矩阵由 MATLAB的生成器确定,并有它 自己的特性。空矩阵是简单的,它们是 MATLAB大小为零的变量。 >) size([ D) ans 当没有其它合适的结果时,在MA∏LAB中的许多函数返回空矩阵。或许最普通的例子 是函数find: ))X=(1: 5)-3 new data >)y=find(x>2) 在这个例子里,x没有包含大于2的值,所以没有返回下标。为了测试空结果, MATLAB 提供了逻辑函数 isempty >isempty(y)
上面的第一和第二计算式对 NaN 输入给出 NaN 结果。然而,最后两个计算式产生有点 令人惊讶的结果。当 NaN 与 NaN 相比较时,(a= =nan)产生全部为 0 或假的结果,同时(a~ =nan)产生全部 1 或真值。于是,单个 NaNs 相互不相等。由于 NaNs 的这种特性,MATLAB 有一个内置逻辑函数寻找 NaNs。 » g=isnan(a) g = 0 0 1 0 1 这个函数用 find 命令能找出 NaNs 的下标值。例如, » i=find(isnan(a)) % find indices of NaNs i = 3 5 » a(i)=zeros(size(i)) % changes NaNs in a to zeros a = 1 2 0 Inf 0 当 NaNs 数学上由 IEEE 标准充分定义时,空矩阵由 MATLAB 的生成器确定,并有它 自己的特性。空矩阵是简单的,它们是 MATLAB 大小为零的变量。 » size([ ]) ans = 0 0 当没有其它合适的结果时,在 MATLAB 中的许多函数返回空矩阵。或许最普通的例子 是函数 find: » x=(1:5)-3 % new data x = -2 -1 0 1 2 » y=find(x>2) y = [ ] 在这个例子里,x 没有包含大于 2 的值,所以没有返回下标。为了测试空结果,MATLAB 提供了逻辑函数 isempty。 » isempty(y) ans = 1
在 MATLAB里,空矩阵不等于任何非零矩阵(或标量)。这个事实由下面例子给出: []; 0 这说明一个空矩阵不等于一个标量,因此 > find(y= =0) ans 也就是说没有返回下标。同样地 b=(y~=0) 一个空矩阵不等于一个标量。但 >)j=find(y=0) 尽管y大小为零,现在有一个下标值!上面最后的一个例子是 MATLAB中一个非文本变化 由于版本35先于版本40,一个空矩阵与一个非空矩阵比较返回一个空矩阵。“这个新的 解释通常导致产生问题,因为 y(find(y=0)不存在。’例如, >y(find(y=0)) ?77 Index exceeds matrix dimensions 这里 MATLAB报告一个错误,因为下标超出了空矩阵y的维数 NaNs和空矩阵的特性概括在表55中。 表5.5 NaNs和空矩阵 数据 表达式 结果 [24 Nan oo NaNI
在 MATLAB 里,空矩阵不等于任何非零矩阵(或标量)。这个事实由下面例子给出: » y=[ ]; » a=(y==0) a = 0 这说明一个空矩阵不等于一个标量,因此, »find(y= =0) ans = [ ] 也就是说没有返回下标。同样地, b=(y~=0) b = 1 一个空矩阵不等于一个标量。但 » j=find(y~=0) j = 1 尽管 y 大小为零,现在有一个下标值!上面最后的一个例子是 MATLAB 中一个非文本变化, 由于版本 3.5 先于版本 4.0,一个空矩阵与一个非空矩阵比较返回一个空矩阵。‘这个新的 解释通常导致产生问题,因为 y(find(y~=0))不存在。’例如, » y(find(y~=0)) ??? Index exceeds matrix dimensions. 这里 MATLAB 报告一个错误,因为下标超出了空矩阵 y 的维数。 NaNs 和空矩阵的特性概括在表 5.5 中。 表 5.5 NaNs 和 空 矩 阵 数据 a=[1 2 nan inf nan] 表达式 结果 2*a [2 4 NaN NaN]
0000] isnan(a) y=find(a== y=[ isempty(y) 0 find 0) find(y E does not exist
(a= =nan) [0 0 0 0 0] (a~ =nan) [1 1 1 1 1] isnan(a) [0 0 1 0 1] y=find(a= =0) y=[ ] isempty(y) 1 (y= =0) 0 find(y= =0) [ ] (y~ =0) 1 j=find(y~ =0) j=1 y(j) Error! y(j) does not exist