2.4 MATLAB运算
2.4.1 算术运算
MATLAB具有两种不同类型的算术运算,即矩阵运算和数组运算。矩阵运算遵循线性代数的法则,数组运算则是执行逐个元素运算,并支持多维数组。
MATLAB的基本算术运算有+(加)、−(减)、*(乘)、/(右除)、\(左除)、^(乘方)。
1.矩阵运算
矩阵算术运算是在矩阵意义下进行的,单个数据(即标量)的算术运算只是一种特例。
(1)矩阵加减法
假定有两个矩阵 A 和 B,则可以由 A+B(或调用函数 plus(A,B))和 A−B(或调用函数minus(A,B))实现矩阵的加减运算。运算规则是:若参与加/减运算的两个矩阵的维度相同,则两个矩阵的相应元素相加减。若参与加/减运算的两个矩阵的维度不相同,则MATLAB将给出错误信息。例如:
>> A=[1,2,3,4;5,6,7,8];
>> B=[11,12,13,14;20,20,20,20];
>> A+B
ans =
12 14 16 18
25 26 27 28
>> B=[11,12,13;20,20,20];
>> A+B
矩阵维度必须一致。
标量也可以和矩阵进行加减运算,运算方法是:矩阵的每个元素与标量进行加减运算。例如:
>> x=[1,2,3;4,5,6];
>> y=x-5i
y =
1.0000 - 5.0000i 2.0000 - 5.0000i 3.0000 - 5.0000i
4.0000 - 5.0000i 5.0000 - 5.0000i 6.0000 - 5.0000i
(2)矩阵乘法
假定有两个矩阵A和B,若A为m × n矩阵,B为n × p矩阵,则C = A·B为m × p矩阵,其各个元素为
例如:
>> A=[1,2,3;4,5,6;7,8,9];
>> B=[-1,0,1;1,-1,0;0,1,1];
>> C1=A*B
C1 =
1 1 4
1 1 10
1 1 16
>> C2= B*A
C2 =
6 6 6
-3 -3 -3
11 13 15
可见,A·B ≠ B·A,即对矩阵乘法运算而言,交换律不成立。
矩阵A和B进行乘法运算,要求A的列数与B的行数相等。如果两者内部维度不一致,则无法进行运算。例如:
>> A=[1,2,3;4,5,6];
>> B=A*A
错误使用 *
内部矩阵维度必须一致。
在 MATLAB 中,还可以进行矩阵和标量相乘,标量可以是乘数也可以是被乘数。矩阵和标量相乘是矩阵中的每个元素与此标量相乘。
(3)矩阵除法
在MATLAB中,有两种矩阵除法运算即\和/,分别表示左除和右除。如果A矩阵是非奇异方阵,则A\B和B/A运算可以实现。A\B等效于A的逆左乘B矩阵,也就是inv(A)*B,而B/A等效于A矩阵的逆右乘B矩阵,也就是B*inv(A)。
对于含有标量的运算,两种除法运算的结果相同,如3/4和4\3有相同的值,都等于0.75。又如,设a = [10.5,25],则a/5和 5\a 的结果都是 [2.1000, 5.0000]。
对于矩阵来说,左除和右除表示两种不同的除数矩阵和被除数矩阵的关系。对于矩阵运算,一般A\B ≠ B/A。例如:
>> A=[3,2,3.5;4,5,6;0.7,8,9];
>> B=[1,8,7;4,5,6;7,8,9];
>> C1=B/A
C1 =
-2.1326 1.7753 0.4236
0 1.0000 0
-0.6961 2.3204 -0.2762
>> C2=B\A
C2 =
-2.6625 0.7500 0.4375
-5.2750 -0.5000 -0.8750
6.8375 0.7500 1.4375
矩阵A和B进行右除运算,要求A与B具有相同的列数,否则无法运算。例如:
>> A=[3,2,3.5;4,5,6;0.7,8,9];
>> B=[1,8;4,5;7,9];
>> C1=B/A
错误使用 /
矩阵维度必须一致。
(4)矩阵的幂运算
矩阵的幂运算可以表示成A^x,要求A为方阵,x为标量。例如:
>> A=[1,2,3;11,12,13;7,8,9];
>> A^2
ans =
44 50 56
234 270 306
158 182 206
显然,A^2即A*A。
若x是一个正整数,则A^x表示A自乘x次。若x为0,则得到一个与A维度相同的单位矩阵。若x小于0且A的逆矩阵存在,则A^x = inv(A)^(−x)。例如:
>> A=[3,2,3.5;4,5,6;0.7,8,9];
>> A^0
ans =
1 0 0
0 1 0
0 0 1
>> A^-1
ans =
-0.1105 0.3683 -0.2026
-1.1713 0.9042 -0.1473
1.0497 -0.8324 0.2578
2.数组运算
数组运算针对向量、矩阵和多维数组的对应元素逐个执行运算。在 MATLAB 中,数组运算采用在有关算术运算符前面加点的方法,所以又叫点运算。由于矩阵运算和数组运算在加减运算上意义相同,所以点运算符只有.*、./、.\和.^。例如:
>> A=[3,2,3.5;4,5,6;0.7,8,9];
>> B=[1,8,7;4,5,6;7,8,9];
>> C3=A.*B
C3 =
3.0000 16.0000 24.5000
16.0000 25.0000 36.0000
4.9000 64.0000 81.0000
A.*B表示A和B单个元素之间对应相乘,显然与A*B的结果不同。
数组运算时,如果操作数的大小相同,则第一个操作数中的每个元素都会与第二个操作数中同一位置的元素匹配。如果操作数的大小兼容,则每个输入都会根据需要进行隐式扩展,以匹配另一个输入的大小。例如:
>> x=[1,2,3;4,5,6];
>> y=[10,20,30];
>> z1=x.*y %x是2×3矩阵,y是1×3矩阵
z1 =
10 40 90
40 100 180
>> z2=x.^2 %底是2×3矩阵,指数是1×1矩阵
z2 =
1 4 9
16 25 36
>> z3=2.^x %底是1×1矩阵,指数是2×3矩阵
z3 =
2 4 8
16 32 64
如果A、B两矩阵具有相同的维度,则A./B表示A矩阵除以B矩阵的对应元素,B.\A等价于A./B。例如:
>> x=[1,2,3;4,5,6];
>> y=[10,20,30;0.1,0.2,0.3];
>> z1=x./y
Z1 =
0.1000 0.1000 0.1000
40.0000 25.0000 20.0000
>> z2=y.\x
Z2 =
0.1000 0.1000 0.1000
40.0000 25.0000 20.0000
显然x./y和y.\x值相等。这与前面介绍的矩阵的左除、右除运算是不一样的。
若两个矩阵的维度一致,则A.^B表示两矩阵对应元素进行乘方运算。例如:
>> x=[4,5,6,7;8,9,10,11];
>> y=[4,3,2,1;-1,2,-1,2];
>> z=x.^y
z =
256.0000 125.0000 36.0000 7.0000
0.1250 81.0000 0.1000 121.0000
数组运算是 MATLAB 很有特色的一种运算,是许多初学者容易弄混的一个问题。下面再举一个例子进行说明。
当x为向量[1, 1.5, 2, 3]时,分别求y = x2cosx的值。命令应当写为
>> x=[1, 1.5, 2, 3];
>> y=x.*x.*cos(x);
其中,x是一个有4个元素的向量,求得的y 也是一个有4个元素的向量,y的各个元素是x中对应元素的函数值,因此y的表达式中必须使用点乘运算。如果x是标量(即1×1矩阵),则可以用矩阵的乘法运算。
数组运算中,幂运算的指数可以是分数或小数,即可以用于求根。此时,若作为底数的数组的所有元素都是正数或0,则运算结果是实数;若底数包含负数,则运算结果是复数。例如:
>> x=[0,27,100];
>> y=[x.^(1/3) ; x.^(1/4)]
y =
0 3.0000 4.6416
0 2.2795 3.1623
>> x=[0,-27,100];
>> y=[x.^(1/3) ; x.^(1/4)]
y =
0.0000 + 0.0000i 1.5000 + 2.5981i 4.6416 + 0.0000i
0.0000 + 0.0000i 1.6119 + 1.6119i 3.1623 + 0.0000i
3.MATLAB常用数学函数
MATLAB提供了许多数学函数,用于计算矩阵元素的函数值。表2.6列出了一些常用数学函数。
表2.6 常用数学函数
函数使用说明如下。
(1)函数的自变量规定为矩阵,运算法则是将函数逐项作用于矩阵的元素上,因而运算的结果是一个与自变量同维度的矩阵。例如:
>> y=sin(0:pi/2:2*pi)
y =
0 1.0000 0.0000 -1.0000 -0.0000
>> y=abs(y)
y =
0 1.0000 0.0000 1.0000 0.0000
(2)三角函数都有两个,函数末尾字母为d的函数的参数是角度,另一个函数的参数是弧度,例如sin(x)中的x为弧度,而sind(x)中的x为角度。
(3)abs函数可以求实数的绝对值、复数的模、字符串的ASCII码值。
>> x=[-3.14,3+4i];
>> abs(x)
ans =
3.1400 5.0000
>> abs('A')
ans =
65
(4)rem函数与mod函数的区别。rem(x,y)和mod(x, y)要求x、y必须为相同大小的实矩阵或为标量。当y ≠ 0时,rem(x, y) = x − y.*fix(x./y),而mod(x,y) = x − y.*floor(x./y);当y = 0时,rem(x, 0) = NaN,而mod(x,0) = x。显然,当x、y同号时,rem(x,y)与mod(x,y)相等;当x、y不同号时, rem(x,y)的符号与x相同,而mod(x, y)的符号与y相同。例如:
>> x=5;y=3;
>> [rem(x,y),mod(x,y)]
ans =
2 2
>> x=-5;y=3;
>> [rem(x,y),mod(x,y)]
ans =
-2 1
(5)power函数的第2个参数可以是分数或小数。此时,若power函数的第1个参数的所有元素都是正数或0,则运算结果是实数;若power函数的第1个参数包含负数,则运算结果是复数。例如:
>> x=[0,-27,100];
>> y=power(x,2/3)
y =
0.0000 + 0.0000i -4.5000 + 7.7942i 21.5443 + 0.0000i
>> y=power(x.^2,1/3)
y =
0 9.0000 21.5443
当幂运算的底数为正数或0时,power(x,1/n)与nthroot(x,n)等效。当底数为负数时,若指数为奇数,则power(x,1/n)的结果为复数,nthroot(x,n)的结果为实数;当底数为负数时,若指数为偶数或小数、分数,则只能使用power函数,不能使用nthroot函数。例如:
>> nthroot(10,3)
ans =
2.1544
>> nthroot(-10,0.3)
错误使用 nthroot (line 28)
如果 X 为负数,那么 N 必须为奇数。
2.4.2 关系运算
MATLAB提供了6种关系运算符,即<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、= =(等于)、~=(不等于)。关系运算符的运算法则如下。
(1)当参与比较的量是两个标量时,若关系成立,则关系表达式结果为1,否则为0。例如:
>> x=5;
>> x==10
ans =
logical
0
(2)当参与比较的量是两个维度相同的矩阵时,逐个比较对两矩阵相同位置的元素,并给出元素的比较结果。最终的结果是一个维度与原矩阵相同的矩阵,其元素由0或1组成。例如:
>> A=[1,2,3;4,5,6];
>> B=[3,1,4;5,2,10];
>> C=A>B
C =
2×3 logical 数组
0 1 0
0 1 0
(3)当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素逐个比较,并给出元素的比较结果。最终的运算结果是一个维度与矩阵相同的矩阵,其元素由0或1组成。例如:
>>A =[3,1,4;5,2,10];
>> B=A>4
B =
2×3 logical 数组
0 0 0
1 0 1
2.4.3 逻辑运算
MATLAB 提供了&(与)、|(或)、~(非)逻辑运算符和异或运算函数 xor(a,b),用于处理矩阵的逻辑运算。
设参与逻辑运算的是两个标量a和b,那么,逻辑运算符和逻辑运算函数的含义如下。
● a & b表示a和b做逻辑与运算,当a、b全为非零时,运算结果为1,否则为0。
● a | b表示a和b做逻辑或运算,当a、b中只要有一个非零时,运算结果为1。
● ~a表示对a做逻辑非运算,当a为零时,运算结果为1;当a为非零时,运算结果为0。
● 函数xor(a,b)表示a和b做逻辑异或运算,当a、b的值不同时,运算结果为1,否则运算结果为0。
矩阵逻辑运算法则如下。
(1)若参与逻辑运算的是两个维度相同的矩阵,那么运算将逐个对矩阵相同位置上的元素按标量规则进行运算。最终运算结果是一个与原矩阵维度相同的矩阵,其元素由1或0组成。例如:
>> A=[23,-54,12;2,6,-78];
>> B=[5,324,7;-43,76,15];
>> C1=A>0 & B<0
C1 =
2×3 logical 数组
0 0 0
1 0 0
>> C2 = xor(A>0,B>0)
C2 =
2×3 logical 数组
0 1 0
1 0 1
(2)若参与逻辑运算的一个是标量,另一个是矩阵,那么运算将在标量与矩阵中的每个元素之间按标量规则逐个进行运算。最终运算结果是一个与矩阵维度相同的矩阵,其元素由1或0组成。
(3)逻辑非是单目运算符,也服从矩阵运算规则。
MATLAB还提供了两个用于获取向量整体状况的函数,即all函数和any函数。若向量的所有元素非零,all函数的返回值则为1,否则为0;若向量的任一元素非零,any函数的返回值则为1,否则为0。例如:
>> x=[1,2,3,0];
>> all(x)
ans =
logical
0
在算术运算、关系运算、逻辑运算中,算术运算优先级最高,逻辑运算优先级最低。