第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进行数值运算。