
2.1 数组与矩阵
数值数组(简称为数组)是MATLAB中最重要的一种内建数据类型,是MATLAB软件定义的运算规则,其具有数据管理方便、操作简单、指令形式自然和执行计算有效性强等优点。
2.1.1 数组的创建与操作
行数组:n个元素排成一行又称为行向量;
列数组:m个元素排成一列又称为列向量。
用方括号[ ]创建一维数组就是将整个数组放在方括号里,行数组元素用空格或逗号分隔,列数组元素用分号分隔,标点符号一定要在英文状态下输入。
【例2-1】 创建数组示例。
程序命令如下:

运行结果如下:

【例2-2】 访问数组示例。
程序命令如下:

运行结果如下:

【例2-3】 对一子数组赋值。
程序命令如下:

运行结果如下:

1.用冒号创建一维数组
在MATLAB中,通过冒号创建一维数组的方法如下:
x=a:b
x=a:inc:b
其中,a是数组x中的第一个元素,b不一定是数组x的最后一个元素。默认inc=1。
【例2-4】 用冒号创建一维数组示例。
程序命令如下:

运行结果如下:

2.用logspace()函数创建一维数组
x=logspace(a,b):创建行向量x,第一个元素为10a,最后一个元素为10b,形成总数为50个元素的等比数列。
x=logspace(a,b,n):创建行向量x,第一个元素为10a,组后一个元素为10b,形成总数为n个元素的等比数列。
【例2-5】 logspace()函数创建一维数组示例。
程序命令如下:

运行结果如下:

3.用linspace()函数创建一维数组
x=linspace(a,b):创建行向量x,第一个元素为a,组后一个元素为b,形成总数为100个元素的等比数列。
x=linspace(a,b,n);创建行向量x,第一个元素为a,组后一个元素为b,形成总数为n个元素的等比数列。
【例2-6】 用linspace()函数创建一维数组示例。
程序命令如下:

运行结果如下:

2.1.2 常见的数组运算
1.数组的算数运算
两个一维数组之间可以进行运算的条件如下:
(1)两个数组都为行数组(或都为列数组);
(2)数组元素个数相同。
如表2-1所示,给出了数组常用的运算格式。
表2-1 数组常用的运算格式

【例2-7】 数组加减法示例。
程序命令如下:

运行结果如下:

【例2-8】 数组乘法示例。
程序命令如下:

运行结果如下:

【例2-9】 数组除法示例。
程序命令如下:

运行结果如下:

【例2-10】 数组乘方示例。
程序命令如下:

运行结果如下:

通过函数dot可以实现数组的点积运算,该函数调用方法如下:
C=dot(A,B);
C=dot(A,B,DIM);
【例2-11】 数组点积运算示例。
程序命令如下:

运行结果如下:

2.数组的关系运算
MATLAB中两个数组之间的关系通常有6种描述:小于(<)、大于(>)、等于(==)、小于等于(<=)、大于等于(=)和不等于(>~=)。MATLAB 在比较两个元素大小时,如果表达式为真,则返回结果1,否则返回0。
【例2-12】 数组的关系运算示例。
程序命令如下:

运行结果如下:

2.1.3 矩阵的表示
MATLAB的强大功能之一体现在能直接处理向量或矩阵。当然处理之前首先要输入待处理的向量或矩阵。
对于矩阵的创建有如下4种方法:
(1)直接输入法;
(2)载入外部数据文件;
(3)利用MATLAB内置函数创建矩阵;
(4)利用M文件创建和保存矩阵。
下面将分别进行介绍。
1.直接输入法
最简单的建立矩阵的方法是从键盘直接输入矩阵的元素。将矩阵的元素用方括号括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用空格或逗号分隔,不同行的元素之间用分号分隔。如果只输入一行则形成一个数组(又称作向量)。矩阵或数组中的元素可以是任何MATLAB表达式,既可以是实数,也可以是复数。在此方法下创建矩阵需要注意以下规则:
(1)矩阵元素必须在[]内;
(2)矩阵的同行元素之间用空格(或,)隔开;
(3)矩阵的行与行之间用“;”(或回车符)隔开。
【例2-13】 用直接输入的方法来创建矩阵。
程序命令如下:

运行结果如下:

2.载入外部数据文件
在MATLAB中,Load函数用于载入生成的包含矩阵的二进制文件,或者读取包含数值数据的文本文件。文本文件中的数字应排列成矩形,每行只能包含矩阵的一行元素,元素与元素之间用空格分隔,各行元素的个数必须相等。
例如,用Windows自带的记事本或用MATLAB的文本调试编辑器创建一个包含下列数字的文本文件:

把该文件命名为data.txt,并保存在MATLAB的目录下。如需读取该文件,可在命令行窗口中输入:

系统将读取该文件并创建一个变量data,包含上面的矩阵。在MATLAB工作空间中可以查看这个变量。
【例2-14】 读取数据文件trees。
程序命令如下:

运行结果如图2-1所示。

图2-1 读取数据文件trees
读取数据文件trees,在工作空间会产生数组X,可以查看或编辑该数组。
3.利用MATLAB内置函数创建矩阵
在MATLAB中,系统内置特殊函数可以用于创建矩阵,通过这些函数,可以很方便地得到想要的特殊矩阵。系统内置创建矩阵函数如表2-2所示。
表2-2 系统内置创建矩阵特殊函数

【例2-15】 利用几种系统内置特殊函数来创建矩阵。
程序命令如下:

运行结果如下:

4.利用M文件创建和保存矩阵
此方法需要用MATLAB自带的文本编辑调试器或其他文本编辑器来创建一个文件,代码和在MATLAB命令行窗口中输入的命令一样即可,然后以.m格式保存该文件。
【例2-16】 把输入的内容以纯文本方式存盘(设文件名为matrix.m)。
程序命令如下:

即运行该M文件,就会自动建立一个名为matrix的矩阵,可供以后使用。
2.1.4 寻访矩阵
在MATLAB中,寻访矩阵方法主要有下标寻访、单元素寻访和多元素寻访,下面分别进行介绍。
1.下标寻访
MATLAB中的矩阵下标表示法与数学表示法相同,使用“双下标”,分别表示行与列,矩阵中的元素都有对应的“第几行,第几列”。
除了双下标表示法,MATLAB还提供了一种线性下标表示法,又称“单下标”法,使用线性下标时,系统默认矩阵的所有元素按照列从上到下,行从左到右排成一列,只需要使用一个下标索引就可以定位矩阵中的任何一个元素。
在MATLAB还提供了用户下标计算函数,sub2ind用于双下标计算单下标,ind2sub用于单下标计算双下标,以方便不同下标之间的转换。
【例2-17】 利用双下标提取矩阵元素。
程序命令如下:

运行结果如下:

【例2-18】 创建一个矩阵,用单、双下标进行相应元素的访问,并将双下标转换为单下标。
程序命令如下:

运行结果如下:

2.单元素寻访
MATLAB中,单元素寻访必须指定两个参数,即其所在行数和列数,才能访问一个矩阵中的单个元素。例如,访问矩阵M中的任何一个单元素的调用格式为

row和column分别代表行数和列数。
【例2-19】 对矩阵M进行单元素寻访。
程序命令如下:

运行结果如下:

3.多元素寻访
矩阵多元素的寻访,包括寻访该矩阵的某一行或某一列的若干元素,访问整行、整列元素,访问若干行或若干列的元素以及访问矩阵所有元素等。例如:
(1)A(e1:e2:e3)表示取数组或矩阵A的第e1元素到e3的所有元素,步长是e2;
(2)A([m n l])表示取数组或矩阵A中的第m、n、l个元素;
(3)A(:,j)表示取A矩阵的第i列全部元素;
(4)A(i,:)表示A矩阵第i行的全部元素;
(5)A(i:i+m,:)表示取A矩阵第i~i+m行的全部元素;
(6)A(:,k:k+m)表示取A矩阵第k~k+m列的全部元素;
(7)A(i:i+m,k:k+m)表示取A矩阵第i~i+m行内,并在第k~k+m列中的所有元素;
(8)还可利用一般向量和end运算符来表示矩阵下标,从而获得子矩阵。end表示某一维的末尾元素下标。
【例2-20】 对创建的矩阵进行多元素访问。
程序命令如下:

运行结果如下:

2.1.5 矩阵的拼接
两个或者两个以上的单个矩阵,按一定的方向进行连接,生成新的矩阵就是矩阵的拼接。矩阵的拼接是一种创建矩阵的特殊方法,区别在于基础元素是原始矩阵,目标是新的合并矩阵。矩阵的拼接分为按照水平方向拼接和按照垂直方向拼接两种。例如,对矩阵A和B进行拼接,拼接表达式分别如下:
水平方向拼接:C=[A B]或C=[A,B]
垂直方向拼接:C=[A;B]。
【例2-21】 把3阶魔术矩阵和3阶单位矩阵在水平方向上拼接成为一个新矩阵,垂直方向上拼接成为一个新矩阵。
程序命令如下:

运行结果如下:

矩阵拼接时,必须满足原始矩阵维数对应,如果不满足条件,则拼接将会出错。
【例2-22】 非对应矩阵的拼接示例。
程序命令如下:

运行的结果如下:

在MATLAB中,除了使用矩阵拼接符[],还可以使用矩阵拼接函数拼接矩阵,如下:
(1)cat函数用于按指定的方向拼接矩阵。其调用格式为
C=cat(dim,A,B):按照dim指定的方向连接矩阵A与B,构造出矩阵C。
其中,dim用于指定连接方向。
C=cat(dim,A1,A2,A3,A4,...):A1、A2、A3、A4,...表示被连接的多个矩阵。
(2)repmat函数用于通过输入矩阵的备份拼接出一个大矩阵。其调用格式为
B=repmat(A,m,n)或B=repmat(A,[m n]):rempat函数建立一个大矩阵B,B是由矩阵A的备份拼接而成的,纵向摆m个备份,横向摆n个备份,B中总共包含m×n个A。A为被用来进行复制的矩阵;m为纵向上复制A的次数;n为横向上复制A的次数。
B=repmat(A,[m n p...]):repmat函数生成一个多维(m×n×p×...)数组B,B由矩阵A的m×n×p×...个备份在多个方向拼接而成。
当A为标量时,生成一个m×n矩阵(矩阵由指定数据类型的A的值组成)。对于某些值,使用其他函数也可以获得同样的结果,例如:
qrempat(NaN,m,n)等价于NaN(m,n);
qrempat(single(inf),m,n)等价于inf(m,n,'single');
qrempat(int8(0),m,n)等价于zeros(m,n,'int8');
qrempat(uint32(1),m,n)等价于ones(m,n,'uint32');
qrempat(eps,m,n)等价于eps(ones(m,n))。
(3)horzcat函数用于对矩阵进行水平拼接。其调用格式为
C=horzcat(A1,A2,...):水平连接多个矩阵A1、A2...参数列表中的所有矩阵都必须有相同的行数。
horzcat函数连接n维数组是沿第二维(即行)的方向,因此被连接数组的第一维和其他维的大小必须匹配。
(4)vertcat函数用于垂直连接矩阵。其调用格式为
C=vertcat(A1,A2,...):用于垂直连接多个矩阵A1、A2...参数列表中的所有矩阵都必须有相同的列数。该函数连接n维数组是沿第一维(即列)的方向,因此被连接数组的其他维的大小必须匹配。当使用C=[A1;A2;...]垂直连接矩阵时,实际上是调用C=vertcat(A1,A2,...)函数。
(5)blkdiag函数用于通过输入的矩阵构造一个块对角矩阵。其调用格式为
T=blkdiag(A,B,C,D,...):blkdiag函数用输入的矩阵A、B、C、D...构造一个块对角矩阵T。
【例2-23】 利用cat函数拼接矩阵。
程序命令如下:

运行结果如下:

【例2-24】 使用rempat函数拼接矩阵。
程序命令如下:

运行结果如下:

【例2-25】 建立9个1的矩阵。
程序命令如下:

运行结果如下:

【例2-26】 利用horzcat函数建立一个3×5阶的矩阵A及一个3×3阶的矩阵B,然后进行水平连接。
程序命令如下:

运行结果如下:

【例2-27】 利用vertcat函数对创建的A、B矩阵进行垂直拼接。
程序命令如下:

运行结果如下:

2.1.6 矩阵的运算
在MATLAB中,矩阵的运算包括+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)等运算。
1.矩阵的加减运算
两个矩阵相加或相减是指具有相同行和列的两矩阵的对应元素相加减。允许参与运算的两矩阵之一是标量(常量)。标量与矩阵的所有元素分别进行加减操作。
【例2-28】 由A+B和A-B实现矩阵的加减运算。
程序命令如下:

运行结果如下:

如果A与B的维数不相同,则MATLAB将给出错误信息,如下MATLAB将提示用户两个矩阵的维数不匹配。

2.矩阵的乘除运算
假定有两个矩阵A和B,若A为m×n矩阵,B为n×p矩阵,则可以进行矩阵乘法的操作,即C=A*B为m×p矩阵。矩阵乘法需要被乘矩阵的列数与乘矩阵的行数相等。
矩阵除法运算:\和/,分别表示左除和右除。A\B等效于A的逆左乘B矩阵,而B/A等效于A矩阵的逆右乘B矩阵。左除和右除表示两种不同的除数矩阵和被除数矩阵的关系。对于矩阵运算,一般A\B≠B/A。
【例2-29】 矩阵乘法示例。
程序命令如下:

运行结果如下:

当矩阵相乘不满足被乘矩阵的列数与乘矩阵的行数相等时,例如:

则MATLAB将给出错误信息,提示用户两个矩阵的维数不匹配。
【例2-30】 矩阵除法示例。
程序命令如下:

运行结果如下:

2.1.7 矩阵的乘方
若A为方阵,x为标量,一个矩阵的乘方运算可以表示成A^x。
【例2-31】 矩阵的乘方运算示例。
程序命令如下:

运行结果如下:

若D不是方阵,例如:

则MATLAB将给出错误信息Error:The expression to the left of the equals sign is not a valid target for an assignment。
2.1.8 矩阵的行列式
矩阵的行列式是一个数值。在MATLAB中,det函数用于求方阵A所对应的行列式的值。
【例2-32】 求矩阵的行列式示例。
程序命令如下:

运行结果如下:
