6.1 数组运算
数组运算是MATLAB计算的基础。本节将系统地介绍数组创建、操作和函数运算等内容。
6.1.1 创建与访问数组
本小节介绍在MATLAB中如何建立数组以及数组的常用操作,包括数组的算术运算、关系运算和逻辑运算等。
1.创建数组
可以使用方括号([ ])、逗号(,)、空格和分号(;)来创建数组。数组中同行不同列元素采用逗号或空格进行分隔,不同行元素采用分号进行分隔。
注意
书写以上符号时必须使用西文,MATLAB不能识别中文符号。
例6-1,创建数组示例。
在命令行窗口输入:
A=[] %创建空数组 B=[2 1] %创建行向量数组 C=[2,1] %创建行向量数组 D=[2;1] %创建列向量数组 E=[2 1; 1, 2] %创建二维数组 whos %查看创建的数组属性
输出结果如下:
A = [] B = 2 1 C = 2 1 D = 2 1 E = 2 1 1 2 Name Size Bytes Class Attributes A 0x0 0 double B 1x2 16 double C 1x2 16 double D 2x1 16 double E 2x2 32 double
可以通过访问下标的方式访问数组,实现的方式为使用数组名与下标的组合进行访问。访问时,下标可以取标量,也可以取数组。通过对数组的访问,可以进一步修改数组。
例6-2,访问与修改数组。
在命令行窗口输入:
A=[1 2 3 4 5] %创建行向量数组 a1=A(3) %访问数组第3个元素 A1=A; A1(3)=33 %复制A数组到A1数组中,并通过访问修改A1第三个元素 a2=A(1:3) %访问数组第1、2、3个元素 A2=A; A2(1:3)=[0 0 0] %复制A数组到A2数组中,并通过访问修改A1前三个元素 a3=A(3:end) %访问数组第3个到最后一个元素 a4=A(end:-1:1) %数组元素反序输出 a5=A([1 5]) %访问数组第1个与第5个元素
输出结果如下:
A = 1 2 3 4 5 a1 =3 A1 =1 2 33 4 5 a2 =1 2 3 A2 =0 0 0 4 5 a3 =3 4 5 a4 =5 4 3 2 1 a5 =1 5
MATLAB中还可以通过其他方式创建一维等差与等比数组,具体如下:
通过冒号创建一维等差数组;
通过linspace函数创建一维等差数组;
通过logspace函数创建一维等比数组。
2.通过冒号创建一维等差数组
通过冒号创建一维等差数组的格式如下:
X=a:step:b
其中,a是待创建一维数组的第一项,step为相邻元素递增或递减的数值(MATLAB设置的默认值为1), b是待创建数组元素值的上限或下限;该数组按step变换,直到与b的差的绝对值小于等于step的绝对值,并将此时的数值作为数值的最后一项。
例6-3,通过冒号创建一维等差数组示例。
在命令行窗口输入:
A= 1:5 %使用默认step B=1:0.8:5 %使用充分利用上下限的间距 C=1:0.7:5 %使用未充分利用上下限的间距 D=5:-1:1 %使用为负值的step
输出结果如下:
A = 1 2 3 4 5 B = 1.0000 1.8000 2.6000 3.4000 4.2000 5.0000 C = 1.0000 1.7000 2.4000 3.1000 3.8000 4.5000 D = 5 4 3 2 1
3.通过linspace函数创建一维等差数组
linspace函数创建一维等差数组的调用方式如下:
y = linspace(a, b) y = linspace(a, b, n)
其中,y为待创建行向量;a为首元素;b为尾元素;n为数组元素总数量,在未设置的情况下默认为100,设置为1时y的值为b。
例6-4,通过linspace函数创建一维等差数组示例。
在命令行窗口输入:
A1=linspace(1,30); whos A1 %创建默认长度的等差数列A1,查看其属性 d1=A1(2)-A1(1) %求解A1的公差 A2= linspace (1,30,4) %创建长度为4的等差数列A2 A3= linspace (1,30,1) %创建长度为1的等差数列A3
输出结果如下:
Name Size Bytes Class Attributes A1 1x100 800 double d1 = 0.2929 A2 = 1.0000 10.6667 20.3333 30.0000 A3 = 30
4.通过logspace函数创建一维等比数组
logspace函数创建一维等比数组的调用方式如下:
y = logspace(a, b) y = logspace(a, b, n) y = logspace(a, pi)
其中,y为待创建行向量;10^a为首元素;10^b为尾元素;n为数组元素总数量,在未设置的情况下默认为100,设置为1时y的值为10^b; logspace(a, pi)创建10^a到pi之间的等比数量,这种用法在电子信号处理中很有用。
例6-5,通过logspace函数创建一维等差数组示例。
在命令行窗口输入:
A1=logspace(1,2); whos A1 %创建默认长度的等比数列A1,查看其属性 d1=A1(2)/A1(1) %求解A1的公比 A2= logspace(1,2,4) %创建长度为4的等比数列A2 A3=logspace(1,2,1) %创建长度为1的等比数列A3 A4= logspace(2, pi,5) %创建100到pi的等比数列A4
输出结果如下:
Name Size Bytes Class Attributes A1 1x50 400 double d1 = 1.0481 A2 = 10.0000 21.5443 46.4159 100.0000 A3 = 100 A4 = 100.0000 42.1005 17.7245 7.4621 3.1416
6.1.2 数组运算
本小节介绍数组的算术运算、关系运算和逻辑运算等内容。
1.算术运算
在MATLAB中,数组的基本运算包括加、减、乘、左除、右除和乘方。
(1)数组的加减运算:通过格式A+B或A-B可实现数组的加减运算。运算规则要求数组A和B的维数相同。实现数组对应元素间的加减。
(2)数组与标量的加减:通过格式A+b或A-b可实现数组与标量的加减运算。实现数组每个元素与标量的加减。
(3)数组的乘除法:通过格式A.*B或A./B(或B.\A)可实现数组的乘除法。数组A和B的维数相同,运算为数组对应元素相乘除,计算结果与A或B是相同维数的数组。
提示
右除和左除的关系:A./B=B.\A,其中A是被除数,B是除数。
(4)数组与标量的乘除法:通过格式A*b或A/b可实现数组与标量的乘除法。实现数组每个元素与标量的乘除。
(5)数组的乘方通过乘方格式A.^ B实现数组的乘方运算。数组的乘方运算包括:数组间的乘方运算,数组元素和标量的乘方。
(6)数组的点积通过函数dot()可实现。要求数组A和B的维数相同,其调用格式如下:
C= dot(A, B) C = dot(A, B, dim)
其中,dim为维度。
提示
点积通过函数sum(A.*B)也可以得到相同的结果。
(7)数组的叉积通过函数cross()可实现。要求数组A和B的维数相同,其调用格式如下:
C = cross(A, B) C = cross(A, B, dim)
例6-6,数组的加减运算示例。
在命令行窗口输入:
A=[1 2 3 4 5] B=[5 4 3 2 1] b=[1 2 3 4] C=A+B %加法 E=A-B %减法 F=A+10 %数组与标量的加法 G=A-b %不同长度数组运算,将报错
输出结果如下:
A = 1 2 3 4 5 B = 5 4 3 2 1 b = 1 2 3 4 C = 6 6 6 6 6 E = -4 -2 0 2 4 F = 11 12 13 14 15 Error using - Matrix dimensions must agree.
提示
如果两个数组的长度不相同,则将给出错误的信息。
例6-7,数组的乘法示例。
在命令行窗口输入:
A=[1 2 3 4 5] B=[5 4 3 2 1] C=A.*B %数组的点乘 D=A*3 %数组与标量的乘法
输出结果如下:
A = 1 2 3 4 5 B = 5 4 3 2 1 C = 5 8 9 8 5 D = 3 6 9 12 15
例6-8,数组的除法示例。
在命令行窗口输入:
A=[1 2 3 4 5] B=[5 4 3 2 1] C=A./B %数组左除 D=A.\B %数组右除 E=A./3 %数组与标量的除法 F=A/3 %数组与标量的除法 G=A/eps %数组与很小数的除法 H=A/0 %数组与标量的除法
输出结果如下:
A = 1 2 3 4 5 B = 5 4 3 2 1 C = 0.2000 0.5000 1.0000 2.0000 5.0000 D = 5.0000 2.0000 1.0000 0.5000 0.2000 E = 0.3333 0.6667 1.0000 1.3333 1.6667 F = 0.3333 0.6667 1.0000 1.3333 1.6667 G = 1.0e+16 * 0.4504 0.9007 1.3511 1.8014 2.2518 H = Inf Inf Inf Inf Inf
提示
如果除数为0,则结果为无穷大Inf。如果可能出现除数为0的情况,不妨在除数上加减eps,防止运算出错。
例6-9,数组的乘方示例。
在命令行窗口输入:
A=[1 2 3 4 5] B=[5 4 3 2 1] C=A.^B %数组间的乘方 D=A.^3 %数组元素的乘方 E=3.^A %常数的数组的乘方
输出结果如下:
A = 1 2 3 4 5 B = 5 4 3 2 1 C = 1 16 27 16 5 D = 1 8 27 64 125 E = 3 9 27 81 243
例6-10,数组的点积示例。
在命令行窗口输入:
A=[1 2 3 4 5] B=[5 4 3 2 1] C=dot(A, B) %数组的点积 D=sum(A.*B) %数组元素的乘积之和 E=[A; B] F=dot(A, E) %不同结构大小的数组点积,将报错
输出结果如下:
A = 1 2 3 4 5 B = 5 4 3 2 1 C = 35 D = 35 E = 1 2 3 4 5 5 4 3 2 1 Error using dot (line 34) A and B must be same size. Error in ex6_10 (line 6) F=dot(A, E) %不同结构大小的数组点积,将报错
注意
dot(A, B)和sum(A.*B)得到相同的结果;点积运算的数组长度需一致。
2.关系运算
MATLAB提供了6种关系运算符,即<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、==(恒等于)、~=(不等于);可用来进行数组关系运算。
关系运算的运算法则为:
● 当两个比较量是标量时,直接比较两个比较量的大小。若关系成立,返回1,否则返回0。
● 当两个比较量是维数相等的数组时,比较两个数组相同位置的元素,并返回一个与参与数组维数相同的数组,其组成元素为0或1。
● 当两个比较量分别是标量与数组时,将标量与数组元素进行比较,返回一个数组,其组成元素为0或1。
例6-11,数组关系运算示例。
在命令行窗口输入:
A=[1 2 3 4 5] B=[5 4 3 2 1] C=A<4 %数组与标量比较 D=A>=4 %数组与标量比较 E=A<B %数组与数组比较 F=A==A' %维度不同的数组比较,将报错
输出结果如下:
A = 1 2 3 4 5 B = 5 4 3 2 1 C = 1 1 1 0 0 D = 0 0 0 1 1 E = 1 1 0 0 0 Error using == Matrix dimensions must agree.
3.逻辑运算
MATLAB提供了3种关系运算符,即&(与)、|(或)和~(非),可用来进行数组逻辑运算。
逻辑运算的运算法则为:
非零元素则为真,用1表示;零元素为假,用0表示。
当两个运算量是标量时,进行逻辑运算。若成立,返回1,否则返回0。
当两个运算量是维数相等的数组时,比较两个数组相同位置的元素,并返回一个与参与数组维数相同的数组,其组成元素为0或1。
当两个运算量分别是标量与数组时,将标量与数组元素进行比较,返回一个数组,其组成元素为0或1。
例6-12,数组逻辑运算示例。
在命令行窗口输入:
A=[1 2 0 4 0] B=[0 4 3 0 1] C=A&B %数组与数组逻辑运算 D= A|B %数组与数组逻辑运算 E=~ A %数组逻辑运算 F=A&1 %数组与标量逻辑运算 G= A&A' %维度不同的数组比较,将报错
输出结果如下:
A = 1 2 0 4 0 B = 0 4 3 0 1 C = 0 1 0 0 0 D = 1 1 1 1 1 E = 0 0 1 0 1 F = 1 1 0 1 0 Error using & Matrix dimensions must agree.