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.