MATLAB基础与应用教程(第2版)
上QQ阅读APP看书,第一时间看更新

2.3 MATLAB数组

数组和矩阵是MATLAB中信息和数据的基本表示形式。在MATLAB中,所有数据均以矩阵或多维数组的形式进行存储,单个数值也会以矩阵形式存储(矩阵的维度为1×1)。MATLAB的大部分运算或命令都是在数组、矩阵运算的意义下执行的。

2.3.1 构造数组

在 MATLAB 中,数组可以存储和处理数值、字符、逻辑等类型的数据,创建数组时无须对数组的维度和类型进行说明,MATLAB会根据用户所输入的内容自动进行配置。

1.构造矩阵

矩阵是存储数据的二维数组。建立矩阵的最简单的方法是使用矩阵构造运算符[]。具体方法是:将矩阵的所有元素用方括号括起来,按行的顺序输入矩阵各元素,同一行的各元素之间用空格或逗号分隔,不同行的元素之间用分号分隔。例如,输入以下命令:

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

A =

  1   2   3

  4   5   6

  7   8   9

这样,在MATLAB的工作区中就建立了一个矩阵A,以后就可以使用矩阵A

在MATLAB中,矩阵元素可以是复数,建立复数矩阵的方法和上面介绍的方法相同。例如,建立复数矩阵:

>> B=[1,2+7i,5*sqrt(-2);3,2.5i,3.5+6i]

B =

  1.0000 + 0.0000i 2.0000 + 7.0000i 0.0000 + 7.0711i

  3.0000 + 0.0000i 0.0000 + 2.5000i 3.5000 + 6.0000i

2.构造行向量

在 MATLAB 中,冒号是一个重要的运算符,利用它可以构建行向量。冒号表达式的一般格式为

a:b:c

其中,a为初始值,b为步长,c为终止值。冒号表达式可产生一个由a开始到c结束,以步长b自增的行向量。例如:

>> t=0:2:10

t =

  0   2   4   6   8  10

>> t=0:-2:-8

t =

  0  -2  -4  -6  -8

在冒号表达式中如果省略b,则步长为1。例如,t = 0:5与t = 0:1:5等价。

在MATLAB中,还可以用linspace函数构建线性等间距的行向量,logspace函数构建对数等间距的行向量,其调用格式为

linspace(a,b,n)

logspace(a,b,n)

其中,参数ab是生成向量的第1个和最后1个元素,选项n指定向量元素个数。当n省略时,默认生成100个元素。显然,linspace(a, b, n)与a:(b − a)/(n − 1):b等价。例如:

>> x=linspace(0,10,6)

x =

  0   2   4   6   8  10

如果参数b<a,则生成的向量是递减序列,例如:

>> x=linspace(0,-8,6)

x =

  0  -1.6000  -3.2000  -4.8000  -6.4000  -8.0000

3.串联数组

串联数组是用已有数组拼接而成大数组的过程。例如:

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

>> B=[11:13;14:16;17:19];

>> C=[A,B;B,A]

C =

   1   2   3  11  12  13

   4   5   6  14  15  16

   7   8   9  17  18  19

  11  12  13   1   2   3

  14  15  16   4   5   6

  17  18  19   7   8   9

4.获取数组大小

在有些操作中,需要了解数组的大小,可使用MATLAB提供的以下函数。

(1)size函数

size函数用于获取数组指定维度的长度,函数的调用格式为

size(A, dim)

其中,A是数组,dim指定维度。当dim省略时,系统返回一个向量,向量各个元素的值对应每一个维度的长度。例如:

>> A=[1,2,3,4;55,66,77,88]

A =

   1   2   3   4

  55  66  77  88

>> size(A)

ans =

   2   4

>> size(A,2)

ans =

   4

A是一个2×4的矩阵,size(A)返回一个有两个元素的向量,该向量的第1个元素是A的第1维的长度,第2个元素是A的第2维的长度;size(A,2)返回A的第2维的长度。

(2)length函数和numel函数

length函数用于获取最大数组维度的长度,即length(A) = max(size(A));numel函数用于获取数组元素的个数。例如:

>> length(A)

ans =

  4

A是2×4矩阵,第2维的长度最大,所以返回的是第2维的长度4。

>> numel(A)

ans =

  8

A是2×4矩阵,总共有8个元素。

(3)sub2ind函数和ind2sub函数

数组元素可以通过下标来引用,也可以通过索引来引用。索引就是数组元素在内存中的排列顺序。在MATLAB中,数组元素按列存储,先存储第1列元素,再存储第2列元素,依次存储,一直到存储最后一列元素。显然,数组元素的索引(Index)与其下标(Subscript)是一一对应的,以m × n矩阵A为例,数组元素A(x, y)的索引为(y−1)*m+x。例如:

>> A=[0,20,60,300;555,556,7,88]

A =

   0  20  60  300

  555  556   7  88

>> A(5)

ans =

   60

该结果表示A矩阵中索引为5的元素为第3列、第1行的元素,值为60。

调用sub2ind函数可以将数组元素的下标转换为索引,例如:

>> sub2ind(size(A),1,3)

ans =

  5

该结果表示在2×4的矩阵A中,第1行、第3列元素的索引为5。

调用ind2sub函数则可以将数组元素的索引转换为下标,例如:

>> [row,col]=ind2sub(size(A),5)

row =

  1

col =

  3

该结果表示在2×4矩阵A中,索引为5的元素是位于第1行、第3列的元素。

5.构造多维数组

可以通过扩展下标的方式创建多维数组,即将矩阵扩展为三维数组,将三维数组扩展为四维数组等。例如:

>> A=[1,2,3,4;5,6,7,8]; %A是2×4的矩阵

>> AA(:,:,1)=A;

>> AA(:,:,2)=A/2

AA(:,:,1) =

   1   2   3   4

   5   6   7   8

AA(:,:,2) =

  0.5000  1.0000  1.5000  2.0000

  2.5000  3.0000  3.5000  4.0000

执行3条命令后,创建了一个2×4×2的三维数组AA

2.3.2 引用矩阵元素

矩阵是存储数值数据的二维数组,向量和标量都是矩阵的特例,0×0矩阵为空矩阵。引用矩阵元素是指获取和修改矩阵元素的值。

1.引用单个矩阵元素

要引用矩阵中的特定元素,使用以下方式:

A(row, col)

其中,A为矩阵变量,row和col分别指定其行号和列号。例如:

>> A=[1,2,3;4,5,6];

>> A(2,3)=76

A =

  1   2   3

  4   5  76

执行第2条命令,将矩阵A的第2行、第3列的元素赋为76,这时将只改变该元素的值,而不影响其他元素的值。如果给出的行下标或列下标大于原来矩阵的行数和列数,则 MATLAB 将自动扩展原来的矩阵,并将扩展后未赋值的矩阵元素置为0。例如:

>> A=[1,2,3;4,5,6];

>> A(4,6)=100

A =

  1   2   3   4   0   0

  5   6   7   8   0   0

  0   0   0   0   0   0

  0   0   0   0   0  100

在MATLAB中,也可以采用矩阵元素的索引来引用矩阵元素,例如:

>> A(13)=200

A =

  1   2   3  200   0   0

  4   5  76   0   0   0

  0   0   0   0   0   0

  0   0   0   0   0  100

用矩阵元素的索引来引用矩阵元素时,索引值不能超过矩阵的总长度,例如,以上矩阵A中元素的个数为24,以下引用就会出错:

>> A(28)=100

试图沿模糊的维增大数组。

find函数用于查找矩阵中的非零元素,其调用格式为

k = find(X,n,direction)

[row,col,v] = find(X,n,direction)

第一种格式返回矩阵X中的非零元素的索引,第二种格式返回矩阵X中非零元素的下标和值。选项n指定返回n个结果,默认返回所有结果。选项direction的值为’last',返回最后n个索引,默认值为’first',即返回前n个索引。例如:

>> A=[1,2,0,0;0,4,0,5;0,0,8,9];

>> B=find(A)

B =

  1

  4

  5

  9

 11

 12

2.引用矩阵片段

利用MATLAB的冒号运算,可以从给出的矩阵中获得矩阵片段。在MATLAB中,用A(m,n)表示A矩阵第m行、第n列的元素,用A(m1:m0:m2, n1:n0:n2)表示A矩阵第m1~m2行、间距为m0的那些行,以及第n1~n2列、间距为n0的那些列中的所有元素。若冒号表达式中的m0(n0)缺省,表示第m1~m2行的所有行(第n1~n2列的所有列)。若某维度仅有冒号,表示该维度的所有行(或列),如A(m,:)表示A矩阵第m行的全部元素,A(:,n)表示A矩阵的第n列全部元素。例如:

>> A=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15;16,17,18,19,20]

A =

   1   2   3   4   5

   6   7   8   9  10

   11  12  13  14  15

   16  17  18  19  20

>> A(2:3,5) %引用A的第2到3行、第5列的元素

ans =

   10

   15

>> A(1:2:3,:)  %引用A的第1行和第3行、所有列的元素

ans =

   1   2   3   4   5

  11  12  13  14  15

此外,还可利用一般向量和 end 运算符等来表示矩阵下标,从而获得子矩阵。end 表示某一维度的最后一个元素。例如:

A(end,:)     %引用A最后一行元素

ans =

  16  17  18  19  20

A([1,4],3:end)   %引用A第1行和第4行中第3列到最后一列的元素

ans =

    3   4   5

   18  19  20

3.删除矩阵行或列

在MATLAB中,空矩阵是指无任何元素的矩阵,表示形式为[]。将某些行或列从矩阵中删除,采用将其置为空矩阵的方法就是一种有效的方法。例如:

>> A=[1,2,3,4,5,6;7,8,9,10,11,12;13,14,15,16,17,18]

A =

   1   2   3   4   5   6

   7   8   9  10  11  12

  13  14  15  16  17  18

>> A(:,[2,4])=[] %删除A矩阵的第2列和第4列元素

A =

   1    3    5   6

   7    9   11   12

  13   15   17   18

注意,A=[]与clear A不同,执行命令clear A,将从工作区中清除变量A;而执行A=[],矩阵A仍存在于工作区,只是矩阵长度为0。

4.改变矩阵形状

(1)reshape函数

reshape(A,m,n)函数在矩阵元素个数保持不变的前提下,将矩阵A重新排成m × n的矩阵。例如:

  >> x=linspace(100,111,12);    %产生有12个元素的行向量x

  >> y=reshape(x,3,4)        %利用向量x建立3×4矩阵y

  y =

  100 103 106 109

  101 104 107 110

  102 105 108 111

>> y=reshape(x,2,6)

y =

  100 102 104 106 108 110

  101 103 105 107 109 111

reshape函数只是改变原矩阵的行数和列数,即改变其逻辑结构,但并不改变原矩阵元素个数及矩阵元素的存储顺序。

(2)矩阵堆叠

A(:)将矩阵A的各列元素堆叠起来,成为一个列向量,例如:

>> A =[1,2,3;-4,-5,-61]

A =

   1   2   3

  -4  -5  -61

>> B=A(:)

B =

   1

  -4

   2

  -5

   3

  -61

在这里,A(:)产生一个6×1的矩阵,等价于reshape(A,6,1)。