MATLAB宝典
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 数组

本章包括

◆ 创建数值数组

◆ 操作数值数组

数组是MATLAB的基础内容,几乎所有的数据都是用数组的形式进行储存的,因此,MATLAB又被称为矩阵实验室。从MATLAB 5.x版本开始,基于面向对象的考虑,这些数组就成为MATLAB中的内建数据类型(BuiIt-in Data Type),而数组运算就是定义这些数据结构的方法。在本章中,将介绍关于数组类型和数组运算的内容。

2.1 创建数值数组

创建数组是所有MATLAB运算和操作的基础,针对不同维度的数组,MATLAB提供了多种创建方法,分别可以创建不同要求的数组类型。在本节中,将分别根据数组维度以及方法的不同来介绍如何创建数组。

2.1.1 一维数组的创建方法

在MATLAB中,一维和二维数组都被认为是比较低维的数组。它们的创建方法比较简单,同时,也是创建高维数组的基础条件,下面将以简单的例子来说明如何在MATLAB中创建各种不同的数组类型。

例2.1 在MATLAB中,使用不同的方法来创建一维数组。

step 1 在MATLAB的命令窗口中输入下面的程序代码:

            >> data1=[pi;log(5);7+6;2^3];
            >> data2=[pi log(5) 7+6 2^3];
            >> data3=2:2:10;
            >> data4=2:10;
            >> data5=linspace(2,10,5);
            >> data6=logspace(1,5,10);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到以下结果:

            data1 =
                3.1416
                1.6094
              13.0000
                8.0000
            data2 =
                3.1416   1.6094   13.0000   8.0000
            data3 =
             2        4    6    8    10
            data4 =
             2        3    4    5    6    7    8    9    10
            data5 =
             2        4    6    8    10
            data6 =
          1.0e+005 *
                0.0001    0.0003    0.0008    0.0022    0.0060    0.0167    0.0464
            0.1292   0.3594   1.0000

上面的结果基本演示了在MATLAB中创建一维数组的方法。

直接输入法:在上面的程序代码中,data1和data2就是直接输入法。其中data1在输入数据的时候,使用了分号,创建了一维列数组;data2则在创建过程中使用了空格,因此创建了一维行数组。

步长生成法:在上面的程序代码中,data3和data4的创建方法就是步长生成法,其通用方法是a:inc:b,其中a表示的是数组的第一个元素,inc是创建数组之间的间隔,也就是步长,b则是数组中的最后一个元素。其中inc可以省略,默认的数值为1。

定数线性采样法:在上面的程序代码中,data5的创建方法就是定数线性采样方法,该方法在设定“总个数”的条件下,均匀采样分布生成一维行数组,这种方法的调用格式为:x=Iinspace(a,b,n),其中a和b分别是数组的第一个和最后一个元素,n表示的是采样点数。

定数对数采样法:在上面的程序代码中,data6的创建方法就是定数对数采样法。这种方法在设定“总个数”的条件下,经过“常用对数”采样生成一维行数组。这种方法的调用格式为x=Iogspace(a,b,n)。

说明

在步长生成法中,步长参数inc的数值可以是正数,也可以是负数,当inc是正数的时候,必须满足a<b;当inc是负数的时候,必须满足a>b。

2.1.2 二维数组的创建方法

在本节中将介绍如何在MATLAB中创建二维数组。

例2.2 在MATLAB中创建二维数组。

step 1 在MATLAB的命令窗口中输入下面的程序代码:

            >> Data1= [1    2    3
                4    5    6
                7    8    9];
            >> Data2=[1,2,3;4,5,6;7,8,9];

step 2 查看程序结果。在命令窗口输入变量名称,可以得到下面的程序结果:

            Data1 =
                1    2    3
                4    5    6
                7    8    9
            Data2 =
                1    2    3
                4    5    6
                7    8    9

上面的例子基本演示了在MATLAB中创建二维数组的方法,Data1的创建方法比较直接,得到的结果就是输入的结果;Data2的创建方法则是更加普遍的方法,关于该方法需要注意下面的内容:

◆ 整个输入数组必须以方括号“[]”作为创建的首尾。

◆ 数组的行和行之间必须用分号“;”间隔。

◆ 数组的列和列之间必须用逗号“,”间隔。

提示

上面使用的创建方法适用的范围比较窄,当数组的行或者列数比较大的时候,该创建方法就会显得比较烦琐,至于其他方法将在后面章节中加以介绍。

2.1.3 使用下标创建三维数组

在MATLAB中,习惯将二维数组的第一维称为“行”,第二维称为“列”,而对于三维数组,其第三维则习惯性地称为“页”。在MATLAB中,将三维或者三维以上的数组统称为高维数组。由于高维数组的形象思维比较困难,在本节中将主要以三维为例来介绍如何创建高维数组。

例2.3 使用下标引用的方法创建三维数组。

step 1 在MATLAB的命令窗口中输入下面的程序代码:

            A(2,2,2)=1;
            >> for i=1:2
            for j=1:2
            for k=1:2
            A(i,j,k)=i+j+k;
            end
            end
            end

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到下面的程序结果:

            >> A(:,:,1)
                3    4
                4    5
            >> A(:,:,2)
                4    5
                5    6

step 3 创建新的高维数组。在MATLAB的命令窗口中输入下面的程序代码:

            >> B(3,4,:)=2:5;

step 4 查看程序结果。在命令窗口中输入变量名称,可以得到下面的程序结果:

            >> B(:,:,1)
                0    0    0    0
                0    0    0    0
                0    0    0    2
            >> B(:,:,2)
                0    0    0    0
                0    0    0    0
                0    0    0    3
            >> B(:,:,3)
                0    0    0    0
                0    0    0    0
                0    0    0    4
            >> B(:,:,4)
                0    0    0    0
                0    0    0    0
                0    0    0    5

说明

从结果中可以看出,当使用下标的方法创建高维数组的时候,需要使用各自对应的维度的数值,没有指定的数值则在默认情况下为0。

2.1.4 使用低维数组创建三维数组

本节将介绍如何在MATLAB中使用低维数组创建三维数组。

例2.4 使用低维数组创建高维数组。

step 1 在MATLAB的命令窗口中输入下面的程序代码:

            >> D2=[1,2,3;4,5,6;7,8,9];
            >> D3(:,:,1)=D2;
            >> D3(:,:,2)=2*D2;
            >> D3(:,:,3)=3*D2;d

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到以下结果:

            >>D2
            D2 =
                1    2    3
                4    5    6
                7    8    9
            >> D3
            D3(:,:,1) =
                1    2    3
                4    5    6
                7    8    9
            D3(:,:,2) =
                2    4    6
                8   10   12
           14        16    18
            D3(:,:,3) =
                3    6    9
           12        15    18
           21        24    27

提示

从结果中可以看出,由于三维数组中“包含”了二维数组,因此可以通过二维数组来创建各种三维数组。

2.1.5 使用创建函数创建三维数组

本节将介绍如何利用MATLAB的创建函数来创建三维数组。

例2.5 使用函数命令来创建高维数组。

step 1 使用cat命令来创建高维数组。在MATLAB的命令窗口中输入下面的程序代码:

            >> D2=[1,2,3;4,5,6;7,8,9];
            >> C=cat(3,D2,2*D2,3*D2);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到以下结果:

            C(:,:,1) =
                1    2    3
                4    5    6
                7    8    9
            C(:,:,2) =
                2    4    6
                8    10   12
                14   16   18
            C(:,:,3) =
                3    6    9
                12   15   18
                21   24   27

说明

cat命令的功能是连接数组,其调用格式为C = cat(dim,A1,A2,A3,A4...),其中,dim表示的是创建数组的维度,A1,A2,A3,A4表示的是各维度上的数组。

step 3 使用repmat命令来创建数组。在MATLAB的命令窗口中输入下面的程序代码:

            >> D2=[1,2,3;4,5,6;7,8,9];
            >> D3 = repmat(D2,2,3);
            >> D4=repmat(D2,[1 2 3]);

step 4 查看程序结果。在命令窗口中输入变量名称,可以得到以下结果:

            D2 =
                1    2    3
                4    5    6
                7    8    9
            D3 =
                1    2    3    1    2    3    1    2    3
                4    5    6    4    5    6    4    5    6
                7    8    9    7    8    9    7    8    9
                1    2    3    1    2    3    1    2    3
                4    5    6    4    5    6    4    5    6
                7    8    9    7    8    9    7    8    9
            D4(:,:,1) =
                1    2    3    1    2    3
                4    5    6    4    5    6
                7    8    9    7    8    9
            D4(:,:,2) =
                1    2    3    1    2    3
                4    5    6    4    5    6
                7    8    9    7    8    9
            D4(:,:,3) =
                1    2    3    1    2    3
                4    5    6    4    5    6
                7    8    9    7    8    9

说明

repmat命令的功能在于复制并堆砌数组,其调用格式B = repmat(A,[m n p...])中,A表示的是复制的数组模块,第二个输入参数则表示该数组模块在各个维度上的复制个数。

step 5 使用reshape命令来创建数组。在MATLAB的命令窗口中输入以下代码:

            >> D2=[1,2,3,4;5,6,7,8;9,10,11,12];
            >> D3=reshape(D2,2,2,3);
            >> D4=reshape(D2,2,3,2);
            >> D5=reshape(D2,3,2,2)

step 6 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            >> D2
            D2 =
                1     2    3    4
                5     6    7    8
                9    10   11    12
            >> D3
            D3(:,:,1) =
                1     9
                5     2
            D3(:,:,2) =
                6     3
                10    7
            D3(:,:,3) =
                11    8
                4    12
            >> D4
            D4(:,:,1) =
                1     9    6
                5     2   10
            D4(:,:,2) =
                3    11    8
                7     4   12
            >> D5
            D5(:,:,1) =
                1     2
                5     6
                9    10
            D5(:,:,2) =
                3     4
                7     8
                11   12

说明

reshape命令的功能在于修改数组的大小,因此可以将二维数组通过该命令修改为三维数组,其调用格式为B = reshape(A,[m n p ...]),其中A就是待重组的矩阵,后面的输入参数则表示数组各维的维度。

2.1.6 创建低维标准数组

除了前面介绍的方法,MATLAB还提供了多种函数来生成一些标准数组,用户可以直接使用这些命令来创建一些特殊的数组,下面将使用一些简单的例子来说明如何创建标准数组。

例2.6 使用标准数组命令创建低维数组。

step 1 在MATLAB的命令窗口中输入以下代码:

            >> A=zeros(3,2);
            >> B=ones(2,4);
            >> C=eye(4);
            >> D=magic(5);
            >> randn('state',0);
            >> E=randn(1,2);
            >> F=gallery(5);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            A =
                0    0
                0    0
                0    0
            B =
                1    1    1     1
                1    1    1     1
            C =
                1    0    0     0
                0    1    0     0
                0    0    1     0
                0    0    0     1
            D =
           17    24        1     8   15
           23         5    7   14    16
                4    6   13   20    22
           10    12        19    21    3
           11    18        25    2     9
            E =
          -0.4326   -1.6656
            F =
                -9            11        -21         63       -252
                70        -69           141       -421       1684
              -575        575      -1149       3451          -13801
              3891      -3891           7782     -23345      93365
              1024      -1024           2048      -6144      24572

提示

并不是所有的标准函数命令都可以创建多种矩阵,例如eye、magic等命令就不能创建高维数组。同时,对于每个标准函数,参数都有各自的要求,例如gallery命令中只能选择3或者5。

2.1.7 创建高维标准数组

本节将介绍如何使用标准数组函数来创建高维标准数组。

例2.7 使用标准数组命令创建高维数组。

step 1 在MATLAB的命令窗口中输入以下代码:

            %设置随机数据器的初始条件
            >> rand('state',1111);
            >> D1=randn(2,3,5);
            >> D2=ones(2,3,4);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            >> D1
            D1(:,:,1) =
                0.8156   1.2902    1.1908
                0.7119   0.6686    -1.2025
            D1(:,:,2) =
              -0.0198    -1.6041   -1.0565
              -0.1567    0.2573    1.4151
            D1(:,:,3) =
              -0.8051    0.2193    -2.1707
                0.5287   -0.9219   -0.0592
            D1(:,:,4) =
              -1.0106    0.5077    0.5913
                0.6145   1.6924    -0.6436
            D1(:,:,5) =
                0.3803   -0.0195   0.0000
              -1.0091    -0.0482   -0.3179
            >> D2
            D2(:,:,1) =
              1    1    1
              1    1    1
            D2(:,:,2) =
              1    1    1
              1    1    1
            D2(:,:,3) =
              1    1    1
              1    1    1
            D2(:,:,4) =
              1    1    1
              1    1    1

说明

限于篇幅,在这里就不详细介绍各种命令的参数和使用方法了,有需要的读者请自行阅读相应的帮助文件。

2.2 操作数值数组

在MATLAB中,除了需要创建数组之外,还需要对数组进行各种操作,包括重组、元素变换、提取、旋转等操作,MATLAB都提供了对应的函数命令,本节中将以简单的实例来说明这些命令的使用方法。由于数组维度的不同将会带来MATLAB不同的操作要求,因此,将按不同的数组维度来讨论数组的操作。

2.2.1 选取低维数组的对角元素

低维数组的操作比高维数组的操作在运算或者使用上要简单,因此在本节中将首先使用实例来介绍如何操作低维数组。

例2.8 使用diag命令来选取对角元素或者创建矩阵。

step 1 在MATLAB的命令窗口中输入以下代码:

            >> Data=[1,2,3,4;5,6,7,8;9,10,11,12];
            A1=diag(Data,1);A2=diag(Data);
            A3=diag(Data,-1);
            B1=diag(A2,1);
            B2=diag(A3,1);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            Data =
                1    2    3    4
                5    6    7    8
                9   10   11    12
            A1 =
                2
                7
           12
            A2 =
                1
                6
           11
            A3 =
                5
           10
            B1 =
                0    1    0    0
                0    0    6    0
                0    0    0   11
                0    0    0    0
            B2 =
                0    5    0
                0    0   10
                0    0    0

说明

从结果中可以看出,diag命令的功能可以是选取矩阵对角线的数组,也可以将某个数组创建矩阵,用户可以很方便地利用该命令来处理矩阵对角线的数据。

对于diag命令中参数k的含义,可以用图2.1来形象地说明。

图2-1 diag命令中参数k的含义

2.2.2 低维数组的形式转换

例2.9 对数组或者矩阵进行形式转换:对称变换和旋转。

step 1 在MATLAB的命令窗口中输入如下代码:

            >> Data=[1,2,3,4;5,6,7,8;9,10,11,12];
            %矩阵的转置
            >> B=Data';
            >> C=fliplr(Data);
            >> D=flipud(Data);
            %多次旋转矩阵
            >> E=rot90(Data);
            >> F=rot90(E);
            >> G=rot90(F);
            >> H=rot90(G);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            Data =
                1     2    3     4
                5     6    7     8
                9    10   11     12
            B =
                1     5    9
                2     6   10
                3     7   11
                4     8   12
            C =
                4     3    2     1
                8     7    6     5
                12   11    10    9
            D =
                9    10   11     12
                5     6    7     8
                1     2    3     4
            E =
                4     8   12
                3     7   11
                2     6   10
                1     5    9
            F =
                12   11    10    9
                8     7    6     5
                4     3    2     1
            G =
                9     5    1
                10    6    2
                11    7    3
                12    8    4
            H =
                1     2    3     4
                5     6    7     8
                9    10   11     12

这段代码中演示了各种转换命令,下面简要介绍各种命令的含义。

fIipIr:以数组的垂直中线为对称轴,交换左右对称位置上的数组元素。

fIipud:以数组的水平中线为对称轴,交换左右上下对称位置上的数组元素。

rot90:逆时针旋转二维数组90°。

2.2.3 选取三角矩阵

例2.10 选取数组上三角或者下三角矩阵。

step 1 在MATLAB的命令窗口中输入以下代码:

            >> Data=[1,2,3,4;5,6,7,8;9,10,11,12];
            >> Al=tril(Data);
            >> Bl=tril(Data,1);
            >> Cl=tril(Data,2);
            >> Dl=tril(Data,-1);
            >> Dl=tril(Data,-2);
            >> Au=triu(Data);
            >>Bu=triu(Data,1);
            >>Cu=triu(Data,2);
            >>Du=triu(Data,-1);
            >>Eu=triu(Data,-2);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            Data =
                1    2    3    4
                5    6    7    8
                9   10   11    12
            Al =
                1    0    0    0
                5    6    0    0
                9   10   11    0
            Bl =
                1    2    0    0
                5    6    7    0
                9   10   11    12
            Cl =
                1    2    3    0
                5    6    7    8
                9   10   11    12
            Dl =
                0    0    0    0
                5    0    0    0
                9   10    0    0
            El =
                0    0    0    0
                0    0    0    0
                9    0    0    0
            Au =
                1    2    3    4
                0    6    7    8
                0    0   11   12
            Bu =
                0    2    3    4
                0    0    7    8
                0    0    0   12
            Cu =
                0    0    3    4
                0    0    0    8
                0    0    0    0
            Du =
                1    2    3    4
                5    6    7    8
                0   10   11    12
            Eu =
                1    2    3    4
                5    6    7    8
                9   10   11    12

说明

在上面的步骤中,tril命令的功能是提取矩阵的下三角矩阵,triu命令的功能在于提取矩阵的上三角矩阵,两个命令中的参数k的含义和diag命令相同。

2.2.4 Kronecker乘法

例2.11 演示Kronecker乘法的不可交换性。

step 1 在MATLAB的命令窗口中输入以下代码:

            >> X=[1,2;3,4];
            >> I=eye(3);
            >> A=kron(X,I);
            >> B=kron(I,X);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            X =
                1    2
                3    4
            I =
                1    0    0
                0    1    0
                0    0    1
            A =
                1    0    0    2    0    0
                0    1    0    0    2    0
                0    0    1    0    0    2
                3    0    0    4    0    0
                0    3    0    0    4    0
                0    0    3    0    0    4
            B =
                1    2    0    0    0    0
                3    4    0    0    0    0
                0    0    1    2    0    0
                0    0    3    4    0    0
                0    0    0    0    1    2
                0    0    0    0    3    4

说明

从结果中可以看出,对于相同的两个矩阵,交换后的乘积是不同的结果,因此就证明了Kronecker乘法的不可交换性。关于Kronecker乘法,请读者自行查阅相应的书籍。

2.2.5 高维数组的对称交换

对于高维数组,由于在结构上多了维度,因此在操作方法上多了一些操作其他维度的命令,在本节中还是以简单的实例来介绍这些函数的使用方法。

例2.12 对三维数组进行对称交换。

step 1 在MATLAB的命令窗口中输入以下代码:

            >> Data=[1,2,3,4;5,6,7,8;9,10,11,12];
            >> A=reshape(Data,2,2,3);
            >> B=flipdim(A,1);
            >> C=flipdim(A,2);
            >> D=flipdim(A,3);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            >> A
            A(:,:,1) =
                1     9
                5     2
            A(:,:,2) =
                6     3
                10    7
            A(:,:,3) =
                11    8
                4    12
            >> B
            B(:,:,1) =
                5     2
                1     9
            B(:,:,2) =
                10    7
                6     3
            B(:,:,3) =
                4    12
                11    8
            >> C
            C(:,:,1) =
                9     1
                2     5
            C(:,:,2) =
                3    6
                7    10
            C(:,:,3) =
                8    11
                12    4
            >> D
            D(:,:,1) =
                11    8
                 4    12
            D(:,:,2) =
                 6     3
                10    7
            D(:,:,3) =
                 1     9
                 5     2

说明

在MATLAB中,flipdim(A,k)命令的第一个输入变量A表示的是被操作的数组,第二个输入变量k指定的是对称面。1表示的是与数组行平行的平分面,2表示的是与数据列平行的平分面,3表示的是与数据页平行的平分面。

2.2.6 高维数组的维序号移动

例2.13 对三维数组进行“维序号移动”。

step 1 在MATLAB的命令窗口中输入以下代码:

            >> Data=[1,2,3,4;5,6,7,8;9,10,11,12];
            >> A=reshape(Data,2,2,3);
            >> Adim=shiftdim(A,1);
            >> Adim2=shiftdim(A,2);
            >> Adim3=shiftdim(A,3);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            >> A
            A(:,:,1) =
                1     9
                5     2
            A(:,:,2) =
                6     3
                10    7
            A(:,:,3) =
                11    8
                4   12
            >> Adim
            Adim(:,:,1) =
                1     6   11
                9     3    8
            Adim(:,:,2) =
                5   10     4
                2     7   12
            >> Adim2
            Adim2(:,:,1) =
                1     5
                6   10
                 11    4
            Adim2(:,:,2) =
                9     2
                3     7
                8   12
            >> Adim3
            Adim3(:,:,1) =
                1     9
                5     2
            Adim3(:,:,2) =
                6     3
                 10    7
            Adim3(:,:,3) =
                 11    8
                4   12

2.2.7 高维数组的广义共轭转置

例2.14 对三维数组进行广义共轭转置。

step 1 在MATLAB的命令窗口中输入以下代码:

            >> A=reshape(Data,2,2,3);
            >> Ap1=permute(A,[1,2,3]);
            >> Ap2=permute(A,[2,3,1]);
            >> Ap3=permute(A,[3,2,1]);
            >> Ap4=permute(A,[3,1,2]);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            >> A
            A(:,:,1) =
                1     9
                5     2
            A(:,:,2) =
                6     3
                10    7
            A(:,:,3) =
                11    8
                4   12
            >> Ap1
            Ap1(:,:,1) =
                1     9
                5     2
            Ap1(:,:,2) =
                6     3
                10    7
            Ap1(:,:,3) =
                11    8
                4   12
            >> Ap2
            Ap2(:,:,1) =
                1     6   11
                9     3    8
            Ap2(:,:,2) =
                5   10     4
                2     7   12
            >> Ap3
            Ap3(:,:,1) =
                1     9
                6     3
                11    8
            Ap3(:,:,2) =
                5     2
                10    7
                4   12
            >> Ap4
            Ap4(:,:,1) =
                1     5
                6   10
                11    4
            Ap4(:,:,2) =
                9     2
                3     7
                8   12

说明

在MATLAB中,permute命令的第一个输入变量是被转置的数组,第二个变量表示的是转置方式的行数组,该行数组中元素位置号代表的是新数组的维序号数值。

2.2.8 高维数组的降维操作

例2.15 使用squeeze命令来撤销“孤维”,使高维数组降维。

step 1 在MATLAB的命令窗口中输入以下代码:

            >> B=cat(4,A(:,:,1),A(:,:,2),A(:,:,3));
            >> C=squeeze(B);
            >> size_B=size(B);
            >> size_C=size(C);

step 2 查看程序结果。在命令窗口中输入变量名称,可以得到如下结果:

            >> B
            B(:,:,1,1) =
                1     9
                5     2
            B(:,:,1,2) =
                6     3
                10    7
            B(:,:,1,3) =
                11    8
                 4   12
            >> C
            C(:,:,1) =
                 1     9
                 5     2
            C(:,:,2) =
                 6     3
                10    7
            C(:,:,3) =
                11    8
                 4   12
            >> size_B
            size_B =
                 2     2    1    3
            >> size_C
            size_C =
                 2     2    3

2.3 小结

在本章中,依次介绍了如何在MATLAB中创建和操作数值数组,这些内容都是MATLAB的基础知识,因此希望读者能够熟练掌握。其中数值数组是MATLAB所有操作的重要内容,在后面的章节中,将主要介绍如何使用MATLAB进行数值运算。