除了上面的关系与逻辑操作符,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
元素有限,返回真值。
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)
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里,空矩阵不等于任何非零矩阵(或标量)。这个事实由下面例子给出:
»
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]
(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.