MATLAB软件的逻辑函数
MATLAB从3.0版本开始提供逻辑函数,这些函数在交互运算及进行矩阵的变化中非常有用,可以很方便地查找或替换矩阵中满足一定条件的部分或所有元素,在使用过程中应认真体会每个函数的具体用法,才能在实际应用过程中灵活运用。
1.all:判断是否所有元素为非零数
如果要获得矩阵或向量中非零元素的位置或个数,可以利用all函数。此函数对于向量a(行向量或列向量),如果向量中的每个元素都是非零数,all(a)返回逻辑“真”,即“1”,如果至少一个元素为零,则返回逻辑“非”,即“0”。对于矩阵A,all(A)是作用于列向量上的,即如果矩阵A的某列所有元素都是非零数,则返回结果的当前列为逻辑“真”,即“1”;如果至少有一个为零,则返回结果的当前列为逻辑“假”,即“0”。显然,返回结果为与矩阵A具有同列维的行向量。如果A是多维矩阵,则all(A)将是第1个不是单维的维作为向量,进行运算,运算规则同向量运算。all(A,dim)将指定的第dim维作为向量进行运算。
例2.15 判断矩阵A=[0 1 2;3 4 5]的所有元素是否都大于或等于1。
>> all(all(A))
ans =
0
>> A>=1
ans =
0 1 1
1 1 1
>> all(A>=1)
ans =
0 1 1
而对此向量再做一次all运算,便可以得到最终的结果0。
从以上分析不难看出,如果A=[6 1 2;3 4 5],则all(all(A>=1))=1。
例2.16 举例说明all()函数运算的规则。
>> A=[0 1 2;3 4 5]
A =
0 1 2
3 4 5
>> all(A)
ans =
0 1 1
>> all(A,2)
ans =
0
1
>> c=rand(1,2,3)
c(:,:,1)=
0.8147 0.9058
c(:,:,2)=
0.1270 0.9134
c(:,:,3)=
0.6324 0.0975
>> all(c)
ans(:,:,1)=
1
ans(:,:,2)=
1
ans(:,:,3)=
1
由上例可以看出,三维列向量c进行all()的逻辑运算时,是将第二维作为向量进行计算的,而不是将第一维作为一个向量。
编程技巧:在M函数中,可以充分利用all()函数的功能,对向量或矩阵进行判断,并根据返回结果做出相应的反应。
例如,下面的一段程序:
if all(all(A>=1))
%存放将要执行的代码
end
2.any:判断是否有一个向量元素为非零数
在矩阵处理中,有时候会需要判断矩阵中的元素是否有零或非零值,如在对矩阵进行数组除时,就需要判断作除数的矩阵是否有零元素,any函数可以实现这一功能。此函数也有4种调用格式:any(a)、any(A)、any(A、dim)。对于向量a(行向量或列向量),如果向量中至少有一个元素为非零数,any(a)返回逻辑“真”(即“1”),而如果所有元素都为零,则返回逻辑“非”(即“0”)。对于矩阵A,any(A)与all(A)一样,也是作用于列向量上的,即如果矩阵A的某列中存在某个元素为非零数,则返回结果的当前列为逻辑“真”,即为“1”,如果所有元素都为零,则返回结果的当前列为逻辑“假”,即“0”。如果A是多维矩阵,则any(A)将第1个不是单维的维作为向量,进行运算,运算规则同向量运算。any(A,dim)将指定的第dim维作为向量进行计算。
例2.17 举例说明any()函数运算的规则。
>> A=[0 1 2;0 3 4]
A =
0 1 2
0 3 4
>> any(A)
ans =
0 1 1
>> any(A,2)
ans =
1
1
any()函数的其余规则与all()基本相同,在此不再赘述。
3.exist:查看变量或函数是否存在
在MATLAB程序设计中,有时候需要知道变量是否已经被定义过,即是否存在于当前内存中,有时候还需要详细了解变量的类型,这时exist函数就显得非常有用。a=exist('A')返回变量或函数的状态或类型,a的值及A对应的状态或类型分别如下。
a的值 A的状态或类型
0 如果对象A不存在或没在MATLAB的搜索路径下
1 如果A是工作空间中的一个变量
2 如果A是一个M文件或是一个在MATLAB搜索路径下的未知类型的文件
3 如果A是一个MATLAB搜索路径下的MEX文件
4 如果A是一个MATLAB搜索路径下的已编译的Simulink函数(MDL文件)
5 如果A是MATLAB的内置函数
6 如果A是一个MATLAB搜索路径下的P文件
7 如果A是一个路径,不一定是MATLAB的搜索路径
如果对象A存在于MATLAB的搜索路径下,但并不是MATLAB可以识别的非M文件,即非MDL文件、P文件、MEX文件时,exist('A')或exist('A.ext')将返回2。
注意:exist('A')中,A可以是当前路径下的子目录或相对路径。
例如,MATLAB的当前路径为D:\Program Files\MATLAB,则输入exist('bin')便会得到:
>> exist('bin')
ans =
7
当然也可以检验计算机上的任意一条路径,但必须要输入全部路径。
例如,下面一段程序内容:
>> exist('D:\Program Files\MATLAB')
ans =
7
findall.p是toolbox\MATLAB目录下的一个p文件,输入:
>> exist('findall')
ans =
6
>> exist('sin')
ans =
5
flag=exist('A',kind),如果MATLAB找到指定类型kind下的对象A的话,此语句返回逻辑“真”,即flag值为1,否则返回逻辑“假”,flag值为0。其中,kind参数的取值可以为:
exist('A','var') 仅检查工作空间中的变量
exist(’A’,'builtin') 仅检查MATLAB的内置函数
exist('A','file') 检查MATLAB搜索路径下的文件和路径
exist('A’,'dir') 仅检查路径
例如,下面一段程序内容:
>> exist('a','var') %在工作空间的变量中查找变量a
ans =
0 %表明没有找到名为“a”的变量
>> exist('A','var') %在工作空间的变量中查找变量A
ans =
1 %表明找到名为“A”的变量
>> exist('A','builtin')) %在内置函数中查找函数A
ans =
0 %表明没有找到名为“A”的函数
4.find:找出向量或矩阵中非零元素的位置标识
在许多情况下,都需要对矩阵中符合某一特定条件的元素的位置进行定位,如将某一矩阵中为零的元素设为1等。如果这个矩阵的元素非常多,手工修改就非常麻烦,而灵活运用find函数和各种逻辑及关系运算可以实现绝大多数条件的元素定位。find函数的基本用法有k=find(A),[i, j]=find(A),[i,j,v]=find(A),这是个很有用的逻辑函数,在对数组元素进行查找、替换和修改变化等操作中占有非常重要的地位,熟练运用可以方便而灵活地对数组进行操作。
(1)k=find(A)
此函数返回由矩阵A的所有非零元素的位置标识组成的向量。如果没有非零元素则会返回空值。
例2.18 举例说明find()函数的运算规则。
>> a=[0 1;2 3;0 4]
a =
0 1
2 3
0 4
>> find(a) %查找a中的非零元素
ans = %结果显示元素的标识是按列进行的,即从1开始,
2 %数完第1列再数第2列,依次数下去
4
5
6
>> b(:,:,1)=[0 0;1 2]
b =
0 0
1 2
>> b(:,:,2)=[3 4;5 6]
b(:,:,1)=
0 0
1 2
b(:,:,2)=
3 4
5 6
>> find(b)
ans =
2
4
5
6
7
8
从以上不难看出,多维数组的元素标识是从低维到高维依次进位的,如对于一个三维数组b,它的元素b(1,1,1)、b(2,1,1)、b(1,2,1)、b(2,2,1)、b(1,1,2)、b(2,1,2)、b(1,2,2)、b(2,2,2)的标识依次为1、2、3、4、5、6、7、8。
(2)[i,j]=find(A)
此函数返回矩阵A的非零元素的行和列的标识,其中i代表行标而j代表列标。此函数经常用在稀疏矩阵中。在多维矩阵中通常将第一维用i表示,将其余各维作为第二维,用j表示。如对于上面的三维矩阵b,有:
>> [i,j]=find(b)
i =
2
2
1
2
1
2
j =
1
2
3
3
4
4
(3)[i,j,v]=find(A)
此函数返回矩阵A的非零元素的行和列的标识,其中i代表行标而j代表列标,同时,将相应的非零元素的值放入列向量v中,即i和j的值与[i,j]=find(A)取值相同,只是增加了非零元素的值这一项,例如下面一段程序:
>> [i,j,v]=find(b)
i =
2
2
1
2
1
2
j =
1
2
3
3
4
4
v =
1
2
3
5
4
6
>> a=[-1 -2;-3 -4]
a =
-1 -2
-3 -4
>> find(a<-3) %找出a中小于-3的元素的位置
ans =
4
>> find(a<-2) %找出a中小于-2的元素的位置
ans =
2
4
>> find(a==-1) %找出a中等于-1的元素的位置
ans =
1
>> a(find(a==-4))=-5 %找出a中等于-4的元素并替换为-5
a =
-1 -2
-3 -5
可以实现部分矩阵的替换。
例2.19 利用find()函数实现部分矩阵的替换。
>> b=[3 4;5 6]
b =
3 4
5 6
>> a(find(a==-3))=b(find(a==-3)) %将矩阵a中等于-3的元素换成
a = %矩阵b中相应位置上的元素
-1-2
5 -5 %原来的-3被替换为5
>> a(find(a==-5))=[] %将矩阵a中等于-5的元素删除
a =
-1 5 -2
编程技巧:在矩阵计算中通常可以采用这种方法来删除矩阵,即将矩阵的某个或某行元素直接赋值为零。
如果要删除矩阵b中的第2行,可以这样实现:
>> b(2,:)=[]
b =
3 4
上面“()”中的“:”为操作符,代表第2行的所有元素。
5.isfinite:确认矩阵元素是否为有限值
isfinite(A)如果矩阵A中的元素为有限值,则此函数在返回矩阵的相应位置上输出1,否则输出0。有限值为具有确定值的数,而NaN、+Inf、-Inf等都被视为无限值。函数isinf(A)判断矩阵A的元素是否为无限值,用法与isfinite相同。
注意:NaN称为不确定值,通常由0/0、Inf±Inf、Inf/Inf及NaN与其他任何数进行运算得到;Inf称为无穷大数,可以由任意非零实数除以零得到,而复数除以零会得到NaN数。
例2.20 isfinite()函数的用法。
>> c=[1 2;3 4]
c =
1 2
3 4
>> isfinite(c)
ans =
1 1
1 1
>> d=[1 +inf;nan -inf]
d =
1 Inf
NaN -Inf
>> isfinite(d)
ans =
1 0
0 0
>> isinf(d)
ans =
0 1
0 1
6.isempty:确认矩阵是否为空矩阵
不要把空矩阵、零矩阵及矩阵不存在3个概念混淆,空矩阵说明矩阵存在,但是矩阵没有元素;零矩阵是指矩阵的所有元素都为零;矩阵不存在是指当前的工作空间中没有定义此矩阵变量。isempty(A)可以判断一个存在的矩阵变量A是否为空矩阵,如果A矩阵为空矩阵则返回逻辑“真”,否则返回逻辑“假”,一个零矩阵至少有一维是零,如0×0、0×5、0×3×3等。零矩阵没有任何元素,可以用函数size(A)来判断,如果其中有一维为零,则A就是零矩阵。
例2.21 isempty()函数的用法。
>> a=[]
a =
[]
>> size(a)
ans =
0 0
>> b=rand(3,3,3);
>> b(:,:,:)=[]
b =
Empty array: 0-by-3-by-3
>> size(b)
ans =
0 3 3
说明:b矩阵是一个0×3×3维矩阵,因而a是个零矩阵。
>> isempty(b)
ans =
1
7.isequal:判断几个对象是否相等
isequal(A,B,C…)如果要判断的所有对象A、B、C…具有相同的类型、大小和内容,对于矩阵来说,就是所有矩阵的维数相同,而且矩阵元素的数值相同,如果满足这样的条件,此函数返回逻辑“真”,反之,只要有一个对象与其他对象不相同,就会返回逻辑“假”。
例2.22 isequal()函数的用法。
>> a=[1 2]
a =
1 2
>> b=[1 2]
b =
1 2
>> c='hello world'
c =
hello world
>> d=[1;2]
d =
1
2
>> isequal(a,d)
ans =
0
>> isequal(a,b)
ans =
1
>> isequal(a,b,c)
ans =
0
8.isnumeric:判断对象是否是数据
isnumeric(A)如果A是数据矩阵,如稀疏矩阵、双精度矩阵、复数矩阵等,此函数返回逻辑“真”,反之,如果A是字符串、结构体矩阵等,则返回逻辑“假”。
例2.23 isnumeric()函数的用法。
>> isnumeric(a)
ans =
1
>> isnumeric(c)
ans =
0
>> e=[1+2i 3+4i]
e =
1.0000 + 2.0000i 3.0000 + 4.0000i
>> isnumeric(e)
ans =
1
还有一些逻辑函数,也比较常用,为了保持完整性,将其部分列出,以供参考。
issparse 判断是否为稀疏矩阵
isstr 判断是否为字符串
islogical 判断一个矩阵是否为逻辑矩阵
isfield 判断对象是否为某个结构体矩阵的域
isstruct 判断是否为结构体
ishandle 判断是否为图像句柄