MATLAB是被称为“演算纸”式的高级语言,具有语句简单、移植性好、开放性好、内涵丰富及高效等特点。在MATLAB中,所有代数计算都是基于矩阵运算的处理工具,它把每个变量都看成矩阵,即以矩阵作为基本单位,但无须预先指定维数,对于一个常数,就将其看作一个1×1矩阵。
例如,在语句“A=1;B=2;C=A+B”中,将A、B、C都看作矩阵,执行的是矩阵相加运算。即使A、B是数组变量,也无须定义维数,直接使用即可。
2.1 变量的使用
2.1.1 常量表示
MATLAB的常量表示如表2-1所示。
表2-1 常量表示
说明:
在定义变量时,若定义了系统同名变量,则覆盖系统常量。例如:若定义i、j为循环变量,则
(纯虚数)将不起作用。因此,在定义时应尽量避免与系统常量重名。若已经改变,则可通过clear变量名来恢复其初始值,也可以通过重新启动MATLAB来恢复其原有值。
2.1.2 新建变量
变量工作区有导入数据、保存工作区、新建变量、打开变量和清除工作区等功能。其中,单击“新建变量”按钮,则打开一个二维表(类似Excel表),默认文件名是unnamed1、unnamed2等,如图2.1所示。
图2.1 新建变量
该方法适合于成批导入变量到MATLAB中。
2.1.3 变量命令规则
MATLAB变量名、函数名及文件名由字母、数字或下划线组成,区分字母大小写(如myVar与myvar表示两个不同的变量)。基本规则包括:
(1)要避免与系统预定义的变量名、函数名、保留字同名。
(2)变量名第一个字母必须是英文字母。
(3)变量名可以包含英文字母、下划线和数字。
(4)变量名不能包含空格、标点符号和特色字符。
(5)变量名最多可包含63个字符。
(6)若运算结果未被赋予任何变量,系统则将其赋予特殊变量ans,它只保留最新值。
2.1.4 全局变量
全局变量的作用域在整个MATLAB中有效,所有函数都能对它进行存取和修改。若在函数文件中声明变量为局部变量,则只在本函数内有效,在该函数返回后,这些变量会自动在MATLAB工作间中清除,这与文本文件是不同的。
语法格式:
说明:
(1)如果一个函数内的变量没有特别声明,那么这个变量只在函数内部使用,即局部变量。若某个变量只在某个内存空间使用一次,则不建议使用全局变量。如果两个或多个函数共用一个变量,或子程序与主程序有同名变量(注意:不是参数),则可以用global将其声明为全局变量。全局变量的使用可以减少参数传递,合理利用全局变量可以提高程序的执行效率。
(2)由于各个函数之间、命令行窗口工作间、内存空间都是独立的,因此,在一个内存空间里声明的全局变量,在另一个内存空间里使用时需要再次声明的全局变量,各内存空间声明仅需一次。当全局变量影响内存空间变量时,可使用clear命令清除变量名。
(3)若需要使用其他函数的变量,则需要在主程序与子程序中以分别声明全局变量的方式实现变量传递;否则,函数体内使用的都是局部变量。
(4)当函数较多时,全局变量将给程序调试和维护带来不便,一般不使用全局变量。如果必须使用全局变量,则在原则上全部用大写字母表示,以免和其他变量混淆。
2.1.5 数据类型
MATLAB中有15种基本数据类型,分别为单精度浮点型、双精度浮点型、字符串型、结构体型、函数句柄型、逻辑型、单元数组型和8种整型数据,如图2.2所示。
图2.2 MATLAB数据类型
1.整数
对含有小数的数据自动四舍五入处理,使用带符号和无符号整型变量可节约内存空间。
2.浮点数
MATLAB将所有的数都看作双精度变量,即直接输入的变量属于double型,若要创建single型变量,则需使用转换函数。其他类型函数可以通过转换函数来存储为所需的类型,其表示方法如表2-2所示。
表2-2 字符类型表示
【例2-1】在脚本编辑器中输入程序命令,运行后查看并保存。
程序命令:
输入“whos”(查看内存变量)后的结果:
说明:
当双精度浮点数参与运算时,返回值类型依赖于参与运算中的其他数据类型。当双精度浮点数与逻辑型、字符型进行运算时,返回的结果为双精度浮点型;与整数型进行运算时返回结果为相应的整数型;与单精度浮点型运算时,返回单精度浮点型。单精度浮点型与逻辑型、字符型和任何浮点型进行运算时,返回的结果都是单精度浮点型。
例如:
结果:
注意:
单精度浮点型数据不能和整型数据进行算术运算,整型数据只能与相同类型的整型数据或标量双精度值组合使用。
例如:
结果将显示“错误使用+”的信息提示。
2.1.6 常用标点符号及功能
MATLAB的常用标点符号及功能如表2-3所示。
表2-3 常用标点符号及功能
2.2 矩阵表示
2.2.1 矩阵的建立方法
【例2-2】输入下列矩阵
程序命令:
结果:
2.2.2 向量的建立方法
MATLAB中的每个数都是1×1的矩阵,数组或向量就是1×n或n×1的矩阵。数组、向量和二维矩阵表示在本质上没有任何区别,它们的维数都是2,一切都是以矩阵形式保存的。
1.用线性等间距生成向量矩阵
语法格式:
例如:
结果:
2.线性向量
语法格式:
例如:
结果:
3.对数向量
语法格式:
例如:
结果:
2.2.3 常用特殊矩阵函数
1.全零矩阵
全零矩阵函数为zeros(m,n),用于表示m×n矩阵,每个元素均为0。若只有一个下标值,则表示行和列相同的方阵。
例如,输入zeros(3,4),即
2.全一矩阵
全一矩阵函数为ones(m,n),用于表示m×n矩阵,每个元素均为1。若只有一个下标值,则表示方阵。
例如,输入ones(3,4),即
3.单位矩阵
单位矩阵函数为eye(m,n),用于表示m×n矩阵,主对角线上的元素均为1。若只有一个下标值,则表示方阵。
例如,输入eye(3,4),即
4.对角矩阵
对角矩阵函数为diag(v),v为对角元素值。
例如,输入v=[1 2 3];diag(V),即
MATLAB的特殊矩阵函数如表2-4所示。
表2-4 特殊矩阵函数
说明:
(1)magic(n):为魔方矩阵,其行、列、对角线的元素之和相等,它必须是n阶方阵。
(2)pascal(n):为杨辉三角矩阵(也称为帕斯卡矩阵),是(x+y)n的系数随n增大的三角形表。
(3)toplitz(m,n):为托普利兹矩阵,是除第1行第1列元素外,每个元素与它的左上角元素相等。
(4)triu(A):为上三角矩阵,是保存矩阵A上三角矩阵为原值、下三角为0的阵。
(5)triu(A,k):将矩阵A的第k条对角线以上的元素变成上三角阵。
【例2-3】求3×4的全一矩阵、4×5均匀分布的随机矩阵、上三角阵、魔方矩阵、杨辉三角阵、方程x4+3x3+7x2+5x-9=0的伴随矩阵,并求4行4列的托普利兹矩阵。
程序命令:
结果:
2.2.4 稀疏矩阵
若矩阵中非零元素的个数远远小于矩阵元素的总数,且非零元素的分布没有规律,则称该矩阵为稀疏矩阵。
1.创建稀疏矩阵
语法格式:
稀疏矩阵的存储特点:所占内存少,运算速度快。
说明:
(1)创建的稀疏矩阵只显示非零元素行、列值,可用命令“full(S)”来显示所有矩阵元素。
(2)如果i或j中的任意一个大于最大整数值231-1,则稀疏矩阵不能被创建。
(3)若S=sparse(i,j,s),则使m=max(i)和n=max(j),在S中零元素被移除前计算最大值,[i j s]中的其中一行可能为[m n 0]。
(4)sparse([],[],[],m,n,0)生成m×n所有元素都是0的稀疏矩阵。
(5)当构造矩阵比较大,而非零元素位置又比较有规律时,可以考虑用sparse函数,先构造i、j、s,再自动生成矩阵。
【例2-4】已知i=[2 2 3 3 3 4],j=[2 4 3 2 1 4],A=[2 3 7 1 4 6],创建稀疏矩阵。
程序命令:
结果:
2.创建带状稀疏矩阵
语法格式:
S=spdiags(A,d,m,n) %生成m×n稀疏矩阵,所有非零元素均在对角线上,且对角线元素有规律
·A:表示全元素矩阵。
·d:表示长度为d的整数向量,指定矩阵S的对角线位置。
·m,n:表示构造的稀疏矩阵的行列数。
【例2-5】创建一个三对角的5×5矩阵。
程序命令:
结果:
3.稀疏矩阵操作函数
语法格式:
【例2-6】产生一个5×5带状稀疏矩阵,获取非零元素的个数a、非零元素的值b、非零元素的空间长度c,并图形化显示该稀疏矩阵。
程序命令:
结果:
图形化显示该稀疏矩阵,如图2.3所示。
图2.3 稀疏矩阵图形表示
2.2.5 矩阵拆分
矩阵拆分函数有以下几种:
·A(m,n):提取第m行、第n列元素。
·A(:,n):提取第n列元素。
·A(m,:):提取第m行元素。
·A(m1:m2,n1:n2):提取第m1~m2行和第n1~n2列的所有元素(提取子块)。
·A(:):元素按矩阵的列进行排列。
·矩阵扩展:如果在原矩阵不存在的地址中设定一个数(赋值),那么该矩阵会自动扩展行数、列数,并在该位置上添加这个数,且在其他没有指定的位置补零。
【例2-7】输出拆分矩阵的行和列元素。
程序命令:
结果:
【例2-8】矩阵扩展的应用。
程序命令:
结果:
程序命令:
结果:
2.3 矩阵基本运算
2.3.1 求矩阵的秩、迹和条件数
1.矩阵的秩
将矩阵做初等行变换后,非零行的个数叫作行秩;对其进行初等列变换后,非零列的个数叫作列秩。矩阵的列秩和行秩总是相等的(必须是方阵),才称矩阵的秩。若矩阵的秩等于行数,则称矩阵满秩。
语法格式:
2.矩阵的迹
在线性代数中,把矩阵的对角线之和称为矩阵的迹。只有方阵才可以求迹。
语法格式:
3.矩阵的条件数
矩阵A的条件数等于A的范数与A逆的范数乘积,表示矩阵计算对于误差的敏感性。对于线性方程组Ax=b,如果A的条件数大,则b的微小改变就能引起解x的较大改变,即数值稳定性差。如果A的条件数小,则b有微小的改变所引起x的改变也很微小,即数值稳定性好。它也可以表示b不变、A有微小改变时,x的变化情况。
语法格式:
【例2-9】求矩阵A的秩、迹和条件数。
程序命令:
结果:
2.3.2 求矩阵的逆
若A·B=B·A=E,则称A和B互为逆矩阵。
语法格式:
【例2-10】使用逆矩阵求解下列线性方程组的解。
因为Ax=B,X=A-1B,所以程序命令如下:
结果:
2.3.3 求矩阵的特征值和特征向量
矩阵的特征值与特征向量是线性代数中的重要概念。对于一个n阶方阵A,若存在非零n维向量x与常数λ,使λx=Ax,则称λ是A的一个特征值,x是属于特征值λ的特征向量。我们可以使用
先求解出A的特征值,再代入等量关系求解特征向量(不唯一)。
语法格式:
【例2-11】利用矩阵A=[1 2 3 4;6 7 8 9;11 12 13 14;0 12 17 13]构成对角矩阵D,并求矩阵A的特征向量构成的列向量V。
程序命令:
结果:
2.3.4 矩阵运算
1.算术运算
在MATLAB中,常用的矩阵算术运算符如表2-5所示。
表2-5 常用的矩阵算术运算符
续表
说明:
(1)矩阵相加、减,应具有相同的行和列,以对应各元素相加、减。在矩阵与标量相加减时,矩阵的各元素将都与该标量进行运算。
(2)点运算是一种特殊的运算,其运算符在有关算术运算符前面加点,运算符有“.*”“./”“.\”和“.^”,分别表示点乘、点右除、点左除和点乘方。两个矩阵进行点运算是指将两个矩阵的对应元素进行相关运算,要求这两个矩阵的维数必须相同。
(3)左除:A左除B(A\B)表示矩阵A的逆乘以矩阵B,即inv(A)*B;右除:A右除B(A/B)表示矩阵A乘以矩阵B的逆,即A*inv4。当A为非奇异矩阵时,X=A\B是方程A*X=B的解,而X=B/A是方程X*A=B的解。
A.\B表示矩阵B中每个元素除以矩阵A的对应元素。
A./B表示矩阵A中每个元素除以矩阵B的对应元素。
(4)一个矩阵的乘方运算可以表示成A^x,要求A为方阵,x为标量。
【例2-12】已知矩阵A和B,求两个矩阵加、减、乘、除和A点乘B、A点除B及A的2次乘方。
程序命令:
结果:
【例2-13】计算A*A、A^2与A.^2。
程序命令:
结果:
结论:A*A等价于A^2,但不等价于A.^2。
【例2-14】利用左除解方程组。
程序命令:
结果:
2.复数计算
MATLAB把复数作为一个整体,类似计算实数那样计算复数。
【例2-15】已知复数z1=3+4i,z2=1+2i,z3=2eπi/6,计算z=z1*z2/z3。
程序命令:
结果:
对于复数矩阵,有两种常用输入方法,其结果相同。例如:
结果:
说明:
A与B的结果是相同的。
3.关系运算
MATLAB的关系运算符如表2-6所示。
表2-6 关系运算符
【例2-16】关系运算的应用。
程序命令:
结果:
4.逻辑运算
MATLAB的逻辑运算符如表2-7所示。
表2-7 逻辑运算符
说明:
关系运算和逻辑运算的结果都是逻辑值。如果结果(或元素)为真,就用1表示;否则,就用0表示。“&”和“|”操作符可比较两个标量或两个同阶矩阵。如果A和B都是0-1矩阵,则A&B和A|B也都是0-1矩阵,且0-1矩阵是A和B对应元素的逻辑值。通常,逻辑数在条件语句和数组索引中使用。
【例2-17】逻辑运算的应用。
程序命令:
结果:
2.3.5 求矩阵最大、最小值及矩阵的排序
MATLAB提供了求序列数据的最大值、最小值和排序函数。
1.求向量的最大值和最小值
1)求向量的最大值
求向量的最大值,有以下3种语法格式:
2)求向量的最小值
求向量X的最小值的函数是min(X),用法和max(X)完全相同。
【例2-18】求向量X的最大值和最小值。
程序命令:
结果:
2.求矩阵的最大值和最小值
【例2-19】求矩阵X的最大值和最小值。
程序命令:
结果:
3.矩阵的排序
1)sort函数
排序函数sort()可以对向量、矩阵、数组等元素进行升序或降序排列。当X是矩阵时,sort(X)对X的每一列进行升序或降序排列。
有以下两种语法格式:
【例2-20】对矩阵A进行升序排列和降序排列。
程序代码:
结果:
2)sortrows函数
sortrows函数可以按选定的列值对矩阵行进行排序。
语法格式:
例如:
结果:
2.3.6 求矩阵平均值和中值
求序列数据平均值和中值的函数分别是mean和median。
语法格式:
【例2-21】求
的平均值和中值。
程序命令:
结果:
2.3.7 求矩阵元素和与积
数据、向量或矩阵求和与求积的函数是sum和prod。
语法格式:
【例2-22】求向量与矩阵元素的和与积。
程序命令:
结果:
2.3.8 求元素累加和与累乘积
1)求元素累加和
语法格式:
2)求元素累乘积
【例2-23】求向量与矩阵列元素的累乘积。
程序命令:
结果:
2.4 MATLAB常用函数
2.4.1 随机函数
MATLAB的常用随机函数如表2-8所示。
表2-8 常用随机函数
例如:
程序命令:
结果:
程序命令:
结果:
程序命令:
结果:
程序命令:
结果:
程序命令:
结果:
2.4.2 数学函数
1.常用运算函数
MATLAB的常用运算函数如表2-9所示。
表2-9 常用运算函数
续表
例如:
exp(1)=2.7183
nnz([0 2 3 0 1 4 0 7 0])=5
lcm(76,24)=456
rem(10,3)=1
当x<0时,sign(x)=-1
当x=0时,sign(x)=0
当x>0时,sign(x)=1
【例2-24】已知矩阵A,判断A是否满秩。若满秩,则求其逆矩阵,并计算A的行列式值。
程序命令:
结果:
【例2-25】建立脚本程序,生成一个随机矩阵,放大10倍并取整数赋给矩阵A。输出矩阵A的维数a、行数m、列数n、矩阵所有维的最大长度c、并计算A中非0元素的个数e。
程序命令:
结果:
2.常用三角函数
MATLAB的常用三角函数如表2-10所示。
表2-10 常用三角函数
【例2-26】三角函数的使用。
程序命令:
结果:
3.常用取整函数
MATLAB的常用取整函数如表2-11所示。
表2-11 取整数函数
【例2-27】取整函数的使用。
程序命令:
结果:
2.4.3 转换函数
MATLAB的常用转换函数如表2-12所示。
表2-12 常用转换函数
说明:
参数str、s1、s2为字符型数据,用单引号;num为数值型数据,不加引号,但str2double('num')中的num必须是数值字符型数据,需要加单引号;ascii是字符的ASCII码值(A~Z取65~90,a~z取97~122);X为任意正整数。
【例2-28】转换函数的使用。
程序命令:
结果:
2.4.4 字符串操作函数
MATLAB的常用字符串函数如表2-13所示。
表2-13 字符串操作函数
【例2-29】字符串操作。
程序命令:
结果:
说明:
strrep(str1,str2,str3)是从str1找到str2,用str3替换。
2.4.5 判断数据类型函数
MATLAB的判断数据类型函数如表2-14所示。
表2-14 判断数据类型函数
说明:
判断函数的结果是逻辑值,成立时为1,否则为0。
【例2-30】判断矩阵a是否包含矩阵b的元素。
程序命令:
结果:
【例2-31】判断函数的使用。
程序命令:
结果:
【例2-32】请编写程序,完成以下功能:
(1)找出10~20的所有质数,将这些质数存放在一个行数组里。
(2)求出这些质数之和。
(3)求出10~20的所有非质数之和(包括10和20)。
程序命令:
结果:
【例2-33】判断矩阵A所有的元素都是非零的,检测矩阵B每一列是否全为非零元素程序命令:
结果:
2.4.6 查找函数
语法格式:
【例2-34】建立脚本程序,设A是3维魔方矩阵,求:
(1)返回矩阵A中大于5的元素的坐标;
(2)查找第2列中等于5的元素的坐标;
(3)查找矩阵A中等于9的元素的坐标。
程序命令:
结果:
矩阵A中大于5的元素的坐标:
矩阵A第2列中等于5的元素的坐标:
矩阵A中等于9的元素的坐标:
2.4.7 测试向量函数
1.测试向量元素存在零值
语法格式:
例如:
结果为0。
2.测试向量元素存在非零值
语法格式:
例如:
结果:
2.4.8 日期时间函数
MATLAB的常用日期时间函数如表2-15所示。
表2-15 常用日期时间函数
说明:
(1)无参函数的小括号均可以省略。例如:tic()可用tic代替;clock()可用clock代替。
(2)year、month、day、today、datetime等函数需要在MATLAB附加功能中安装“Financial Toolbox”工具箱后才能使用。
【例2-35】日期时间函数的使用。
程序命令:
结果:
2.4.9 文件操作函数
MATLAB的文件操作函数如表2-16所示。
表2-16 文件操作函数
【例2-36】文件操作的使用。
程序命令:
结果:
2.4.10 句柄函数
MATLAB提供了一种间接访问函数的方式,既可以用函数名实现,也可使用句柄(handle)实现。在已有函数名前添加符号@,即可创建函数句柄(handle)。
创建句柄的语法格式:
或
调用句柄的语法格式:
也可通过匿名函数来创建一个函数句柄。
【例2-37】使用句柄函数。
程序命令:
结果:
2.5 MATLAB数组表示
2.5.1 结构体数组
1.定义结构体数组
结构体数组是指根据字段组合起来的不同类型的数据集合。
【例2-38】定义1×2结构体数组student,表示2个学生成绩。
程序命令:
结果:
结构体通过字段(fields)来对元素进行索引,在访问时只需通过点号来访问数据变量。结构体既可以通过直接赋值的方式来创建,也可以通过结构函数struct来创建。
语法格式:
其中,'field'和val分别为字段和对应值。
字段值可以是单一值或单元数组,但是必须保证它们具有相同的大小。
若输入:
结果:
也可以直接输入:
2.使用结构体数组
MATLAB的常见结构体数组操作函数如表2-17所示。
表2-17 常见结构体数组操作函数
【例2-39】根据例2-38中结构体数组student的定义,进行结构体数组操作。
程序命令:
结果:
2.5.2 元胞(单元)数组
元胞数组是MATLAB特有的一种数据类型,其组成元素是元胞,元胞是用来存储不同类型数据的单元。元胞数组中的每个元胞存储一种类型的数组,此数组中的数据可以是任何一种MATLAB数据类型或用户自定义的类型,其大小也可以是任意的。在同一元胞数组中,第2个元胞的类型、大小可与第1个元胞完全不同。例如,2×2元胞数组结构如图2.4所示。
说明:
元胞数组可以将不同类型或不同尺寸的数据存储在同一个数组。访问元胞数组的方法与访问矩阵的方法基本相同,区别在于访问元胞数组时,需要用大括号{}将下标置于其中。
创建元胞数组与创建矩阵基本相同,区别在于创建矩阵用[],创建元胞数组用{}。
图2.4 元胞数组结构
1.创建元胞数组
1)直接创建
语法格式:
或用大括号{}创建元胞数组并赋值。
例如:
结果:
2)用cellstr将字符数组转换成元胞数组
程序命令:
结果:
2.元胞数组操作
元胞数组操作函数如表2-18所示。
表2-18 元胞数组操作函数
(1)获取指定元胞的大小,用()。
(2)获取元胞的内容,用{}。
(3)获取指定元胞数组指定元素,用{}和()。
程序命令:
结果:
例如,创建元胞数组(一维)。
程序命令:
结果:
3.元胞数组的删除
对元胞数组向量的下标赋空值相当于删除元胞数组的行或列。
例如,删除元胞数组的列。
程序命令:
结果:
说明:
直接在命令窗输入元胞数组名,可显示单元数组的构成单元。使用celldisp函数可显示单元元素,利用索引可以对单元数组进行运算操作。
【例2-40】使用元胞数组。
程序命令:
结果:
不同数据类型的元胞数组元素用不同的颜色表示,如图2.5所示。
图2.5 元胞数组图形表示
2.6 数组集合运算
2.6.1 交运算
交运算的结果既属于矩阵A也属性矩阵B。若矩阵A中的元素在矩阵B中不存在,则结果为空矩阵:0×1。
语法格式:
2.6.2 差运算
矩阵A减矩阵B的差矩阵称为矩阵差运算。若矩阵A中的元素都在矩阵B中存在,则结果为空矩阵:0×1。
语法格式:
2.6.3 并运算
矩阵的并运算可以将多个矩阵合并成一个列序列集。若矩阵A中的元素都在矩阵B中存在,则结果按照矩阵A或矩阵B的值大小依次按列排列。
语法格式:
2.6.4 异或运算
属于矩阵A或属于矩阵B,但不同时属于矩阵A和B的元素的集合称为矩阵A和B的对称差,即矩阵A和B的异或运算。若矩阵A中的元素都在矩阵B中存在,则结果为空矩阵:0×1。
语法格式:
【例2-41】已知矩阵A和B,求它们的交、差、并及异或运算。
程序命令:
结果: