3.4.3 关系运算
MATLAB 中的关系运算符有以下六个:
关系运算符可以用来比较两个数组中元素的关系, 如果比较的结果为真,则 MATLAB 会 返回逻辑值 1;如果结果为假,则会返回逻辑值 0。这里的逻辑值 1 和 0 实际上就是其他编程 语言(例如 C 语言、Java 等)中的布尔型(bool)变量,布尔型变量的值只有真(true)和假(false)。 逻辑值 1 和逻辑值 0 可以简称为逻辑 1 和逻辑 0,对应的英文为 logical 1 和 logical 0。
下面我们举一个例子,大家可以观察 MATLAB 的返回结果:
A = 5;
B = 4;
A == B
% 一个等号是给变量赋值, 两个等号才是判断 是否相等的关系运算符 |
ans = logical
0 |
上一小节中, 我们介绍了 MATLAB 支持的算术运算的兼容模式, 这些兼容模式在关系运 算中也支持,下面举几个例子:
注意:(1)上面表格第三列的 0 和 1 实际上是逻辑值 0 和逻辑值 1;(2)NaN(不定值或缺 失值)相互之间不相等。
易错点: 连续使用关系运算符:有许多初学者喜欢连续使用多个关系运算符, 大家可以试 试下面四条命令,观察 MATLAB 返回的结果是什么:
(1)0 == 0 == 0 (2)1 == 1 == 1 (3)-1 < 0 < 1 (4)1 > 0 > -1
在 MATLAB 中, 连续使用多个关系运算符可能会产生意想不到的结果,上面四条命令的 返回结果如下:
这些不符合预期的结果源于 MATLAB 对多个连续关系运算符的解析方式。以第一条命令 为例: 0 == 0 == 0 实际上被解析为 (0 == 0) == 0。由于 0 == 0 为真(logical 1),因此最终的 表达式变为 1 == 0,结果为假(logical 0);第三条命令也是类似的, - 1 < 0 < 1 实际上被解析 为 (-1 < 0)< 1。由于 - 1 < 0 为真(logical 1),因此最终的表达式变为 1<1,结果为假(logical 0)。第二条和第四条命令也是类似的解释,大家可以自己尝试。
因此,为了避免不必要的错误, 我们应该使用下一小节中介绍的逻辑运算函数(逻辑与&、 逻辑或|、逻辑非~等)连接多个关系表达式,例如判断 a<b<c 对应的命令应为(a<b)&(b<c), 这里的&表示逻辑与,只有当 a<b 和 b<c 同时成立时才返回逻辑值 1,下一小节会详细介绍。
另外,从上面的例子可以看出,逻辑值 1和逻辑值 0不仅仅用于表示真 true和假 false, 它们在进行计算时也可以被视为数值 1 和数值 0。
请看下面的例子:
再来看一个例子:模拟投硬币 10 万次,计算出现正面的次数和频率。
下面我们再来看一个易错点: 判断浮点数是否相等
先给大家简单介绍下什么是浮点数, 浮点数是计算机科学中用于近似表示实数的一种数值 表示法。简单来说, 浮点数由两部分组成: 一个表示数字的部分(称为尾数) 和一个表示数字所在位置的指数。例如,数字 1234.56 可以写成 1.23456×,其中 1.23456 是尾数, 3 是指 数。
有编程基础的同学应该知道, 计算机中的数据是使用二进制 0 和 1 来保存的, 例如十进制 表示的 3 在二进制中表示为 11。虽然十进制能精确表示如 0.1 这样的数,但在二进制中, 0.1却需要表示为一个无限循环的小数 0.00011001100110011…。由于计算机的内存是有限的,这 导致了它无法精确表示 0.1 这样的数值。计算机在处理这类数字时会进行截断或舍入, 所以使 用浮点数计算时可能会产生误差。
MATLAB 中的浮点数分为两种, 分别是双精度(double)浮点数和单精度(single)浮点数,两种浮点数能表示的数值的范围有所不同。默认情况下我们创建的向量或者矩阵中的元素都是使 用双精度浮点数表示的,对这部分内容感兴趣的同学可点击下方链接, MATLAB 的官网有详 细介绍两种的区别: https://ww2.mathworks.cn/help/matlab/matlab_prog/floating-point-numbers.html。
大家可以尝试计算0.5 - 0.4 - 0.1,这是我的 MATLAB 返回的结果:
C = 0.5 - 0.4 - 0.1
C == 0 | C =
-2.7756e-17
ans = logical
0 |
理论上 C 应该等于 0,但由于浮点数计算的误差, MATLAB 得到的 C 约为-2.7756× , 这是一个非常接近 0 的数。当我们试图判断 C 是否等于 0 时,MATLAB 返回逻辑 0,即 MATLAB 认为 C 不等于 0,这显然不是我们期望的结果。
那么我们应该怎样判断两个浮点数相等呢?
解决方法: 使用一个很小的正数来比较浮点数, 而不是直接使用双等号(==)判断。我们 将这个很小的正数称为容差(tolerance,简称为 tol),例如要比较 A 和 B 两个数是否相等, 只 需要满足: |A − B| ≤ tol ,这里的容差 tol 通常取一个非常小的正数, 例如 tol 可取成 (10 的-12 次方) 。tol 越小,判断两个浮点数相等的要求越严格。
abs(C-0) <= | ans = logical
1 |
当然,并非 MATLAB 中所有的浮点数计算都会出现误差。例如,如果我们仅交换 0.1 和 0.4 的位置:
% 仅交换 0.1 和 0.4 的位置
C = 0.5 - 0.1 - 0.4
C == 0 | C =
0
ans = logical
1 |
总之, 当我们需要判断两个浮点数是否相等时, 务必要考虑到计算的误差。感兴趣的同学 可以进一步搜索和学习有关浮点数的知识。