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)
其中,参数a和b是生成向量的第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)。