MATLAB语言运算符
使用inputname可直接获得函数名称。
语法就是
inputname(argnum)
假如有函数x=f(arg1,arg2)
inputname(1)就是第一个名字,(2)就是第二个
编程语言运算符主要为算术运算符、关系运算符和逻辑运算符,还包括一些特殊运算符。下面介绍MATLAB语言的各种运算符。
1.算术运算符
MATLAB算术运算符分为两类:矩阵运算和数组运算。矩阵运算是按线性代数的规则进行运算,而数运算是数组对应元素间的运算。算术运算符及相关运算方式、说明见下表:
MATLAB数组的算术运算,是两个同维数组对应元素之间的运算。一个标量与数组的运算,是标量与数组每个元素之间的运算。
2.关系运算
关系运算用于比较两个同维数组或同维向量的对应元素,结果为一个同维的逻辑数组。关系运算符及说明见下表:
3.逻辑运算
MATLAB提供了两种类型的逻辑运算:一般逻辑运算和捷径运算,见下表:
捷径运算符只对标量值执行逻辑与和逻辑或运算。捷径运算首先判断第一个运算对象,如果可以知道结果,直接返回,而不继续判断第二个运算对象。捷径运算提高了程序运算效率,可以避免一些不必要的错误。例如:
>>x=b&&(a/b>10) %相当于x=(b&&(a/b>10))
如果b=0,捷径运算符不会计算(a/b>10)的值了,也就避免了被0除的错误。
4.特殊运算符
除了以上运算符,MATLAB还经常使用一些特殊的运算符,见下表:
除了传统的数学运算,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出现在A<=4的地方,1出现在A>4的地方。
? 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逻辑操作符包括:
表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<6)
tf =
0 0 1 1 1 0 0 0 0
在A大于2‘与’A小于6处返回1。
最后,上面的功能易于产生数组来表示不连续信号,或由多段其他信号所组成的信号。基本想法是,把数组中要保持的那些值与1相乘,所有其他值与0相乘。例如,
? x=linspace(0, 10, 100); % create data
? y=sin(x) ; % compute sine
? z=(y>=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 ')
图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元素有限,返回真值。
isempty参量为空,返回真值。
isglobal参量是一个全局变量,返回真值。
ishold当前绘图保持状态是‘ON’,返回真
值。
isieee计算机执行IEEE算术运算,返回真值。
isinf元素无穷大,返回真值。
isletter元素为字母,返回真值。
isnan元素为不定值,返回真值。
isreal参量无虚部,返回真值。
isspace元素为空格字符,返回真值。
isstr参量为一个字符串,返回真值。
isstudent MATLAB为学生版,返回真值。
isunix计算机为UNIX系统,返回真值。
isvms计算机为VMS系统,返回真值。
5.4NaNs和空矩阵
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 =
这说明一个空矩阵不等于一个标量,因此,
?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.