1 MATLAB命名规则
2 MATLAB数据类型
1. 整型:
包括有符号位和无符号位。int8(x), int16(x), int32(x), int64(x), uint8(x)……
intmin(), intmax()分别用于确定整型数据类型的下限和上限
x = zeros(3, 'int8'), 表示生成3阶全零矩阵,数据类型为int8
y = ones(5, 'single'), 生成5阶全1矩阵,数据类型为single
whos -- 查看工作区间中的变量信息。whos var -- 查询变量var的信息
2. 浮点型
包括单精度和双精度,single(), double()。MATLAB中输入的数据默认为双精度浮点型。
realmin(), realmax()用于确定浮点型数据类型的下限和上限
3. 字符串
一维字符串:str1='ABCDEFG'; 二维字符串:str2=['ABC'; 'abc']
连接字符串:水平连接 -- str3 = strcat(str1, 'ABC') 或者 str3 = [str1, str2]。其中前者会去除空格,后者不会。垂直连接使用strvcat()函数。
操作函数:
(1)字符串判断:ischar(s), isletter(s), isspace(s)
(2)查找和替换:strfind(str, s)在str中查找s,strrep(s1,s2,s3)在s1中查找s2并替换成s3,strmatch(s1,s2)在s1种匹配与s2起始一致的字符行并返回行号
(3)比较:strcmp(s1, s2), strncmp(s1, s2, n)比较前n个字符,返回逻辑值。strcmpi(s1,s2)不区分大小写
(4)大小写转换:lower(s), upper(s)
(5)字符串执行:eval(expression)
4. 元胞数组 -- 包括各种数据类型的数组
使用大括号{}或者cell()函数生成元胞数组,如a={8,'hello';magic(3),magic(3)>5}, cell(5,3);
celldisp(s) -- 显示元胞数组s的具体内容;celldisp(s, name) -- 以name作为数组的新名称
cellplot(s) -- 以图形化显示数组
当需要删除数组中某个数组时,直接赋空值即可
5. 结构体 -- 把不同数据类型的变量放到同一个变量名下,通过不同“域”的概念对结构体中的不同数据进行赋值、操作。
使用struct()函数生成结构体,s = struct('field1', {}, 'field2', {}, ...)
names = fieldnames(s) --返回各个域名到names
s = rmfield(s, 'field1')--删除某一个“域”
3 MATLAB矩阵操作
3.1 矩阵的表示
在MATLAB中创建矩阵有以下规则:
- 矩阵元素必须在”[ ]”内;
- 矩阵的同行元素之间用空格(或”,”)隔开;
- 矩阵的行与行之间用”;”(或回车符)隔开;
- 矩阵的元素可以是数值、变量、表达式或函数;
- 矩阵的尺寸不必预先定义。
3.2 矩阵的创建
3.2.1 直接输入法
最简单的建立矩阵的方法是从键盘直接输入矩阵的元素,输入的方法按照上面的规则。建立向量的时候可以利用冒号表达式,冒号表达式可以产生一个行向量,一般格式是: e1:e2:e3,其中e1为初始值,e2为步长,e3为终止值。还可以用linspace函数产生行向量,其调用格式为:linspace(a,b,n) ,其中a和b是生成向量的第一个和最后一个元素,n是元素总数。
3.2.2 利用MATLAB函数创建矩阵
基本矩阵函数如下:
- ones()函数:产生全为1的矩阵,ones(n):产生n*n维的全1矩阵,ones(m,n):产生m*n维的全1矩阵;
- zeros()函数:产生全为0的矩阵;
- rand()函数:产生在(0,1)区间均匀分布的随机阵;
- eye()函数:产生单位阵;
- randn()函数:产生均值为0,方差为1的标准正态分布随机矩阵。
3.2.3 利用文件建立矩阵
当矩阵尺寸较大或为经常使用的数据矩阵,则可以将此矩阵保存为文件,在需要时直接将文件利用load命令调入工作环境中使用即可。同时可以利用命令reshape对调入的矩阵进行重排。reshape(A,m,n),它在矩阵总元素保持不变的前提下,将矩阵A重新排成m*n的二维矩阵。
3.3 矩阵的简单操作
3.3.1 获取矩阵元素
可以通过下标(行列索引)引用矩阵的元素,如 Matrix(m,n)。
也可以采用矩阵元素的序号来引用矩阵元素。
矩阵元素的序号就是相应元素在内存中的排列顺序。
在MATLAB中,矩阵元素按列存储。
序号(Index)与下标(Subscript )是一一对应的,以m*n矩阵A为例,矩阵元素A(i,j)的序号为(j-1)*m+i。
其相互转换关系也可利用sub2ind和ind2sub函数求得。
3.3.2 矩阵拆分
利用冒号表达式获得子矩阵:
(1) A(:,j)表示取A矩阵的第j列全部元素;A(i,:)表示A矩阵第i行的全部元素;A(i,j)表示取A矩阵第i行、第j列的元素。
(2) A(i:i+m,:)表示取A矩阵第i~i+m行的全部元素;A(:,k:k+m)表示取A矩阵第k~k+m列的全部元素,A(i:i+m,k:k+m)表示取A矩阵第i~i+m行内,并在第k~k+m列中的所有元素。此外,还可利用一般向量和end运算符来表示矩阵下标,从而获得子矩阵。end表示某一维的末尾元素下标。
利用空矩阵删除矩阵的元素:
在MATLAB中,定义[]为空矩阵。给变量X赋空矩阵的语句为X=[]。注意,X=[]与clear X不同,clear是将X从工作空间中删除,而空矩阵则存在于工作空间中,只是维数为0。
3.3.3 特殊矩阵
(1) 魔方矩阵:魔方矩阵有一个有趣的性质,其每行、每列及两条对角线上的元素和都相等。对于n阶魔方阵,其元素由1,2,3,…,n2共n2个整数组成。MATLAB提供了求魔方矩阵的函数magic(n),其功能是生成一个n阶魔方阵。
(2) 范得蒙矩阵:范得蒙(Vandermonde)矩阵最后一列全为1,倒数第二列为一个指定的向量,其他各列是其后列与倒数第二列的点乘积。可以用一个指定向量生成一个范得蒙矩阵。在MATLAB中,函数vander(V)生成以向量V为基础向量的范得蒙矩阵。
(3) 希尔伯特矩阵:在MATLAB中,生成希尔伯特矩阵的函数是hilb(n)。使用一般方法求逆会因为原始数据的微小扰动而产生不可靠的计算结果。MATLAB中,有一个专门求希尔伯特矩阵的逆的函数invhilb(n),其功能是求n阶的希尔伯特矩阵的逆矩阵。
(4) 托普利兹矩阵:托普利兹(Toeplitz)矩阵除第一行第一列外,其他每个元素都与左上角的元素相同。生成托普利兹矩阵的函数是toeplitz(x,y),它生成一个以x为第一列,y为第一行的托普利兹矩阵。这里x, y均为向量,两者不必等长。toeplitz(x)用向量x生成一个对称的托普利兹矩阵。
(5) 伴随矩阵: MATLAB生成伴随矩阵的函数是compan(p),其中p是一个多项式的系数向量,高次幂系数排在前,低次幂排在后。
(6) 帕斯卡矩阵:我们知道,二次项(x+y)n展开后的系数随n的增大组成一个三角形表,称为杨辉三角形。由杨辉三角形表组成的矩阵称为帕斯卡(Pascal)矩阵。函数pascal(n)生成一个n阶帕斯卡矩阵。
3.4 矩阵的运算
3.4.1 算术运算
MATLAB的基本算术运算有:+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)、’(转置)。运算是在矩阵意义下进行的,单个数据的算术运算只是一种特例。
(1) 矩阵加减运算假定有两个矩阵A和B,则可以由A+B和A-B实现矩阵的加减运算。运算规则是:若A和B矩阵的维数相同,则可以执行矩阵的加减运算,A和B矩阵的相应元素相加减。如果A与B的维数不相同,则MATLAB将给出错误信息,提示用户两个矩阵的维数不匹配。
(2) 矩阵乘法 假定有两个矩阵A和B,若A为m*n矩阵,B为n*p矩阵,则C=A*B为m*p矩阵。
(3) 矩阵除法在MATLAB中,有两种矩阵除法运算:\和/,分别表示左除和右除。如果A矩阵是非奇异方阵,则A\B和B/A运算可以实现。A\B等效于A的逆左乘B矩阵,也就是inv(A)*B,而B/A等效于A矩阵的逆右乘B矩阵,也就是B*inv(A)。对于含有标量的运算,两种除法运算的结果相同。对于矩阵来说,左除和右除表示两种不同的除数矩阵和被除数矩阵的关系,一般A\B≠B/A。
(4) 矩阵的乘方 一个矩阵的乘方运算可以表示成A^x,要求A为方阵,x为标量。
(5) 矩阵的转置 对实数矩阵进行行列互换,对复数矩阵,共轭转置,特殊的,操作符.’共轭不转置(见点运算);
(6) 点运算在MATLAB中,有一种特殊的运算,因为其运算符是在有关算术运算符前面加点,所以叫点运算。点运算符有.*、./、.\和.^。两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵的维参数相同。
3.4.2 关系运算
MATLAB提供了6种关系运算符:<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)、~=(不等于)。关系运算符的运算法则为:
(1) 当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式结果为1,否则为0;
(2) 当参与比较的量是两个维数相同的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成;
(3) 当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。
3.4.3 逻辑运算
MATLAB提供了3种逻辑运算符:&(与)、|(或)和~(非)。 逻辑运算的运算法则为:
(1) 在逻辑运算中,确认非零元素为真,用1表示,零元素为假,用0表示;
(2) 设参与逻辑运算的是两个标量a和b,那么,a&b a,b全为非零时,运算结果为1,否则为0。 a|b a,b中只要有一个非零,运算结果为1。~a 当a是零时,运算结果为1;当a非零时,运算结果为0。
(3) 若参与逻辑运算的是两个同维矩阵,那么运算将对矩阵相同位置上的元素按标量规则逐个进行。最终运算结果是一个与原矩阵同维的矩阵,其元素由1或0组成;
(4) 若参与逻辑运算的一个是标量,一个是矩阵,那么运算将在标量与矩阵中的每个元素之间按标量规则逐个进行。最终运算结果是一个与矩阵同维的矩阵,其元素由1或0组成;
(5) 逻辑非是单目运算符,也服从矩阵运算规则;
(6) 在算术、关系、逻辑运算中,算术运算优先级最高,逻辑运算优先级最低。
3.5 矩阵分析
3.5.1 对角阵
(1) 对角阵只有对角线上有非0元素的矩阵称为对角矩阵,对角线上的元素相等的对角矩阵称为数量矩阵,对角线上的元素都为1的对角矩阵称为单位矩阵。
(2) 提取矩阵的对角线元素设A为m*n矩阵,diag(A)函数用于提取矩阵A主对角线元素,产生一个具有min(m,n)个元素的列向量。diag(A)函数还有一种形式diag(A,k),其功能是提取第k条对角线的元素。
(3) 构造对角矩阵设V为具有m个元素的向量,diag(V)将产生一个m*m对角矩阵,其主对角线元素即为向量V的元素。diag(V)函数也有另一种形式diag(V,k),其功能是产生一个n*n(n=m+k)对角阵,其第m条对角线的元素即为向量V的元素。
3.5.2 三角阵
三角阵又进一步分为上三角阵和下三角阵,所谓上三角阵,即矩阵的对角线以下的元素全为0的一种矩阵,而下三角阵则是对角线以上的元素全为0的一种矩阵。
(1) 上三角矩阵 求矩阵A的上三角阵的MATLAB函数是triu(A)。 triu(A)函数也有另一种形式triu(A,k),其功能是求矩阵A的第k条对角线以上的元素。
(2) 下三角矩阵在MATLAB中,提取矩阵A的下三角矩阵的函数是tril(A)和tril(A,k),其用法与提取上三角矩阵的函数triu(A)和triu(A,k)完全相同。
3.5.3 矩阵的转置与旋转
(1) 矩阵的转置 转置运算符是单撇号(’)。
(2) 矩阵的旋转 利用函数rot90(A,k)将矩阵A旋转90o的k倍,当k为1时可省略。
3.5.4 矩阵的翻转
对矩阵实施左右翻转是将原矩阵的第一列和最后一列调换,第二列和倒数第二列调换,…,依次类推。矩阵A实施左右翻转的函数是fliplr(A),对矩阵A实施上下翻转的函数是flipud(A)。
3.5.5 矩阵的逆与伪逆
(1) 矩阵的逆 对于一个方阵A,如果存在一个与其同阶的方阵B,使得:AB=BA=I (I为单位矩阵) 则称B为A的逆矩阵,当然,A也是B的逆矩阵。求方阵A的逆矩阵可调用函数inv(A)。
(2) 矩阵的伪逆如果矩阵A不是一个方阵,或者A是一个非满秩的方阵时,矩阵A没有逆矩阵,但可以找到一个与A的转置矩阵A’同型的矩阵B,使得:ABA=A,BAB=B 此时称矩阵B为矩阵A的伪逆,也称为广义逆矩阵。在MATLAB中,求一个矩阵伪逆的函数是pinv(A)。
3.5.6 方阵的行列式
把一个方阵看作一个行列式,并对其按行列式的规则求值,这个值就称为矩阵所对应的行列式的值。在MATLAB中,求方阵A所对应的行列式的值的函数是det(A)。
3.5.7 矩阵的秩与迹
(1) 矩阵的秩 矩阵线性无关的行数与列数称为矩阵的秩。在MATLAB中,求矩阵秩的函数是rank(A)。
(2) 矩阵的迹矩阵的迹等于矩阵的对角线元素之和,也等于矩阵的特征值之和。在MATLAB中,求矩阵的迹的函数是trace(A)。
3.5.8 向量和矩阵的范数
矩阵或向量的范数用来度量矩阵或向量在某种意义下的长度。范数有多种方法定义,其定义不同,范数值也就不同。
(1) 向量的3种常用范数及其计算函数 在MATLAB中,求向量范数的函数为:
a、norm(V)或norm(V,2):计算向量V的2-范数;
b、norm(V,1):计算向量V的1-范数;
c、norm(V,inf):计算向量V的∞-范数。
(2) 矩阵的范数及其计算函数 MATLAB提供了求3种矩阵范数的函数,其函数调用格式与求向量的范数的函数完全相同。
(3) 矩阵的条件数 在MATLAB中,计算矩阵A的3种条件数的函数是:
a、cond(A,1) 计算A的1-范数下的条件数;
b、cond(A)或cond(A,2) 计算A的2-范数数下的条件数;
c、cond(A,inf) 计算A的 ∞-范数下的条件数。
3.5.9 矩阵的特征值与特征向量
在MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(A),常用的调用格式有3种:
(1) E=eig(A):求矩阵A的全部特征值,构成向量E。
(2) [V,D]=eig(A):求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量。
(3) [V,D]=eig(A,’nobalance’):与第2种格式类似,但第2种格式中先对A作相似变换后求矩阵A的特征值和特征向量,而格式3直接求矩阵A的特征值和特征向量。
3.6 字符串矩阵
在MATLAB中,字符串是用单撇号括起来的字符序列。MATLAB将字符串当作一个行向量,每个元素对应一个字符,其标识方法和数值向量相同。也可以建立多行字符串矩阵。字符串是以ASCII码形式存储的。abs和double函数都可以用来获取字符串矩阵所对应的ASCII码数值矩阵。相反,char函数可以把ASCII码矩阵转换为字符串矩阵。与字符串有关的另一个重要函数是eval,其调用格式为: eval_r(t) 其中t为字符串。它的作用是把字符串的内容作为对应的MATLAB语句来执行。
3.7 稀疏矩阵
对于一个 n 阶矩阵,通常需要 n2 的存储空间,当 n 很大时,进行矩阵运算时会占用大量的内存空间和运算时间。在许多实际问题中遇到的大规模矩阵中通常含有大量0元素,这样的矩阵称为稀疏矩阵。Matlab支持稀疏矩阵,只存储矩阵的非零元素。由于不存储那些”0″元素,也不对它们进行操作,从而节省内存空间和计算时间,其计算的复杂性和代价仅仅取决于稀疏矩阵的非零元素的个数,这在矩阵的存储空间和计算时间上都有很大的优点。矩阵的密度定义为矩阵中非零元素的个数除以矩阵中总的元素个数。对于低密度的矩阵,采用稀疏方式存储是一种很好的选择。
3.7.1 稀疏矩阵的创建
(1) 将完全存储方式转化为稀疏存储方式函数A=sparse(S)将矩阵S转化为稀疏存储方式的矩阵A。当矩阵S是稀疏存储方式时,则函数调用相当于A=S。 sparse函数还有其他一些调用格式: sparse(m,n):生成一个m*n的所有元素都是0的稀疏矩阵。 sparse(u,v,S)--:u,v,S是3个等长的向量。S是要建立的稀疏矩阵的非0元素,u(i)、v(i)分别是S(i)的行和列下标,该函数建立一个max(u)行、max(v)列并以S为稀疏元素的稀疏矩阵。此外,还有一些和稀疏矩阵操作有关的函数。full(A):返回和稀疏存储矩阵A对应的完全存储方式矩阵。
(2) 直接创建稀疏矩阵 S=sparse(i,j,s,m,n),其中i 和j 分别是矩阵非零元素的行和列指标向量,s 是非零元素值向量,m,n 分别是矩阵的行数和列数。
(3) 从文件中创建稀疏矩阵利用load和spconvert函数可以从包含一系列下标和非零元素的文本文件中输入稀疏矩阵。例:设文本文件 T.txt 中有三列内容,第一列是一些行下标,第二列是列下标,第三列是非零元素值。load T.txt S=spconvert(T)。
(4) 稀疏带状矩阵的创建 S=spdiags(B,d,m,n) 其中m 和n 分别是矩阵的行数和列数;d是长度为p的整数向量,它指定矩阵S的对角线位置;B是全元素矩阵,用来给定S对角线位置上的元素,行数为min(m,n),列数为p 。
(5) 其它稀疏矩阵创建函数
S=speye(m,n)
S=speye(size(A)) % has the same size as A
S=buchy % 一个内置的稀疏矩阵(邻接矩阵)
等等
3.7.2 稀疏矩阵的运算
稀疏存储矩阵只是矩阵的存储方式不同,它的运算规则与普通矩阵是一样的,可以直接参与运算。所以,Matlab中对满矩阵的运算和函数同样可用在稀疏矩阵中。结果是稀疏矩阵还是满矩阵,取决于运算符或者函数。当参与运算的对象不全是稀疏存储矩阵时,所得结果一般是完全存储形式。
3.7.3 其他
(1) 非零元素信息
nnz(S) % 返回非零元素的个数
nonzeros(S) % 返回列向量,包含所有的非零元素
nzmax(S) % 返回分配给稀疏矩阵中非零项的总的存储空间
(2) 查看稀疏矩阵的形状 spy(S)
(3) find函数与稀疏矩阵
[i,j,s]=find(S)
[i,j]=find(S)
返回 S 中所有非零元素的下标和数值,S 可以是稀疏矩阵或满矩阵。
4 MATLAB逻辑与流程控制
Matlab中的程序控制语句包括条件控制(Conditional Control)、循环(Loop Control)、异常处理(Error Control)和程序返回(Program Terminate).
4.1 条件控制语句
条件控制语句又称分支语句,在Matlab中包括if语句和switch语句.
(1) if 语句可以包含多个else或elseif也可以不包含,它必须以end结尾,例如:
注意,其中elseif是连写.
(2) Switch 语句一般包含若干个case和一个otherwise,且必须以end结尾,当表达式的值满足某一个case后,就只执行此case下的语句并结束,不再考虑后面的case. 例如:
a = 25;
switch rem(a,2) #rem(x,y):求整除x/y的余数
case 0
disp(‘a能被2整除’);
case 1
disp(‘a不能被2整除’);
otherwise
disp(‘异常’);
end;
4.2 循环语句
Matlab中的循环语句包括for循环和while循环,循环内支持用continue和break语句跳出循环.
(1) for 循环用于循环次数明确的情况下, 其中控制循环的索引变量用冒号隔开,整个循环语句以end结束. 在默认情况下,每执行一次循环则索引变量加1(也可以自定义索引变量的步长,让每执行一次循环使索引变量增加k,k可为负数),当索引变量的值大于设定的结束值时结束循环.例如:
(2) while循环用于在满足一定条件的情况下一直执行一段语句,当while后的条件不再满足时则结束循环, 例如:
x(1,1)=1;
n=2;
while x(1,n-1)<128
x(1,n)=2*x(1,n-1);
n=n+1;
end;
(3)continue 和 break 语句
简而言之,continue是结束本次循环,break是结束本层循环.
例如在一个for循环中,假设循环索引变量是i, 在i的取值为1到100之间的情况下执行循环(即执行100次循环),且循环模块中的语句总共有30条. 如果在i=50时,执行了循环区域中的前10条语句后出现了continue语句,则此时程序会放弃执行剩下的20条语句,转而执行第i=51次的循环. 因此,continue语句并不改变循环的总次数,只会导致某(些)次循环执行得不完整.
在相同情况下,如果程序在执行了循环区域中的前10条语句后出现break语句,则直接跳出该for循环,转而执行整个循环模块以外的后面的语句. 如果该循环模块包含在另一个大的循环模块中,则继续在大循环模块中执行循环. 因此,break语句会改变循环的次数.
4.3 try...catch 语句
try…catch 语句用于异常和错误处理,当捕获到一个异常时则执行catch后的语句,最后以end结尾,其语法结构如下:
try
statement
…
statement
catch meObj
statement
…
statement
end;
4.4 return 语句
return语句用于直接结束执行,继而返回函数值.
5 MATLAB基本绘图操作
作为一个功能强大的工具软件,Matlab具有很强的图形处理功能,提供了大量的二维、三维图形函数。由于系统采用面向对象的技术和丰富的矩阵运算,所以在图形处理方面方便又高效。
一般来说,一个命令行输入一条命令,命令行以回车结束。但一个命令行也可以输入若干条命令,各命令之间以逗号分隔,若前一命令后带有分号,则逗号可以省略。
如果一个命令行很长,一个物理行之内写不下,可以在第一个物理行之后加上3个小黑点并按下回车键,然后接着下一个物理行继续写命令的其他部分。3个小黑点称为续行符,即把下面的物理行看作该行的逻辑继续。
5.1 二维图形
5.1.1 plot 函数
函数格式:plot(x,y) 其中x和y为长度相同 坐标向量
函数功能:以向量x、y为轴,绘制曲线。
例1:在区间0≤X≤2*pi内,绘制正弦曲线y=sin(x)
x=0:pi/100:2*pi; %必须加上分号,否则x直接显示出来啦
y=sin(x); %必须加上分号,否则x直接显示出来啦
plot(x,y)
结果为:
(1) plot函数最简单的调用格式是只包含一个输入参数:plot(x)
在这种情况下,当x是实向量时,以该向量元素的下标为横坐标,元素值为纵坐标画出一条连续曲线,这实际上是绘制折线图。
(2)含多个输入参数的plot函数调用格式为: plot(x1,y1,x2,y2,…,xn,yn)
Ⅰ.当输入参数都为向量时,x1和y1,x2和y2,…,xn和yn分别组成一组向量对,每一组向量对的长度可以不同。每一向量对可以绘制出一条曲线,这样可以在同一坐标内绘制出多条曲线。
Ⅱ.当输入参数有矩阵形式时,配对的x,y按对应列元素为横、纵坐标分别绘制曲线,曲线条数等于矩阵的列数。
例2:同时绘制正、余弦两条曲线y1=sin(x) 和 y2=cos(x)
x=0:pi/100:2*pi;
y1=sin(x);
y2=cos(x);
plot(x,y1,x,y2)
结果为:
例3:
t=0:0.1:2*pi;
x=t.*sin(3*t); %.*表示点乘,*表示矩阵乘法
y=t.*sin(t).*sin(t);
plot(x,y);
结果为:
例4:
x1=linspace(0,2*pi,100);
x2=linspace(0,3*pi,100);
x3=linspace(0,4*pi,100);
y1=sin(x1);
y2=1+sin(x2);
y3=2+sin(x3);
x=[x1;x2;x3]';
y=[y1;y2;y3]';
plot(x,y,x1,y1-1)
结果为:
(3)具有两个纵坐标标度的图形
在MATLAB中,如果需要绘制出具有不同纵坐标标度的两个图形,可以使用plotyy绘图函数。调用格式为:plotyy(x1,y1,x2,y2)其中x1,y1对应一条曲线,x2,y2对应另一条曲线。横坐标的标度相同,纵坐标有两个,左纵坐标用于x1,y1数据对,右纵坐标用于x2,y2数据对。
例5:用不同标度在同一坐标内绘制曲线 y1=0.2e-0.5xcos(4πx) 和 y2=2e - 0.5xcos(πx)
x1 = 0 : pi/100 : 2*pi
y1 = 0.2 * exp(-0.5 * x1) .* cos(4 * pi * x1)
x2 = 0 : pi/100 : 2*pi
y2 = 2 * exp(-0.5 * x2) .* cos(pi * x2)
plotyy(x1,y1,x2,y2)
结果为:
(4)图形保持
hold on/off命令控制是保持原有图形还是刷新原有图形,不带参数的hold命令在两种状态之间进行切换。
- hold on:启动图形保持功能,当前坐标轴和图形都将保持,此后绘制的图形都将添加在这个图形之上,并且自动调整坐标轴的范围。
- hold off:关闭图形保持功能。
- hold :在hold on 和hold off命令之间进行切换。
例6:采用图形保持,在同一坐标内绘制曲线y1=0.2e-0.5xcos(4πx) 和y2=2e-0.5xcos(πx)。
x=0 : pi/100 : 2*pi;
y1=0.2 * exp(-0.5 * x) .* cos(4 * pi * x);
plot(x,y1)
hold on
y2=2 * exp(-0.5 * x) .* cos(pi * x);
plot(x,y2);
hold off
结果为:
5.1.2 设置曲线样式格式
MATLAB提供了一些绘图选项,用于确定所绘曲线的线型、颜色和数据点标记符号,它们可以组合使用。例如,“b-.”表示蓝色点划线,“y:d”表示黄色虚线并用菱形符标记数据点。当选项省略时,MATLAB规定,线型一律用实线,颜色将根据曲线的先后顺序依次。
调用格式为:plot(x1,y1,选项1,x2,y2,选项2,…,xn,yn,选项n)
要设置曲线样式可以在plot函数中加绘图选项,其调用格式为:
plot(x,y1,’cs’,...)
其中c表示颜色, s表示线型。
例7:用不同线型和颜色重新绘制例2图形,其程序为:
x=0 : pi/100 : 2*pi;
y1=sin(x);
y2=cos(x);
plot(x,y1,'go',x,y2,'b-.')
其中参数'go'和'b-.'表示图形的颜色和线型。g表示绿色,o表示图形线型为圆圈;b表示蓝色,-.表示图形线型为点划线。
例8:在同一坐标内,分别用不同线型和颜色绘制曲线y1=0.2e-0.5xcos(4πx) 和y2=2e-0.5xcos(πx),标记两曲线交叉点。
x=linspace(0,2 * pi,1000);
y1=0.2 * exp(-0.5*x) .* cos(4 * pi * x);
y2=2 * exp(-0.5 * x) .* cos(pi * x);
k=find(abs(y1-y2) < 1e-2);
%查找y1与y2相等点(近似相等)的下标
x1=x(k); %取y1与y2相等点的x坐标
y3=0.2 * exp(-0.5 * x1) .* cos(4 * pi * x1);
%求y1与y2值相等点的y坐标
plot(x,y1,x,y2,'k:',x1,y3,'bp');
结果为:
5.1.3 图形标记
在绘制图形的同时,可以对图形加上一些说明,如图形名称、图形某一部分的含义、坐标说明等,将这些操作称为添加图形标记。
- title(‘加图形标题’);当前轴的正上方居中位置处输出文本作为标题
- xlabel('加X轴标记');
- ylabel('加Y轴标记');
- text(X,Y,'添加文本');
函数中的说明文字,除使用标准的ASCII字符外,还可使用LaTeX格式的控制字符,这样就可以在图形上添加希腊字母、数学符号及公式等内容。例如,text(0.3,0.5,‘sin({\omega}t+{\beta})’)将得到标注效果sin(ωt+β)。
例9:
x=0 : pi/100 : 2*pi;
y1=sin(x);
y2=cos(x);
plot(x,y1,'b*',x,y2,'r>');
title('绘制正弦,余弦函数');
% title(date);
xlabel('横轴');
ylabel('纵轴');
text(2,1,'正弦曲线');
text(1,0.6,'余弦曲线');
结果为:
5.1.4 坐标控制
axis函数的调用格式为:
- axis([xmin xmax ymin ymax zmin zmax])
axis函数功能丰富,常用的格式还有:
- axis equal:纵、横坐标轴采用等长刻度。
- axis square:产生正方形坐标系(缺省为矩形)。
- axis auto:使用缺省设置。
- axis off:取消坐标轴。
- axis on:显示坐标轴。
给坐标加网格线用grid命令来控制。grid on/off命令控制是画还是不画网格线,不带参数的grid命令在两种状态之间进行切换。
给坐标加边框用box命令来控制。box on/off命令控制是加还是不加边框线,不带参数的box命令在两种状态之间进行切换。
例10:
x=linspace(0,2 * pi,60);%生成含有60个数据元素的向量X
y=sin(x);
plot(x,y);
axis ([0 2*pi -2 2]);
grid on;
box on;
结果为:
5.1.5 加图例
给图形加图例命令为legend。该命令把图例放置在图形空白处,用户还可以通过鼠标移动图例,将其放到希望的位置。
格式:legend('图例说明','图例说明');
例11:为正弦、余弦曲线增加图例,其程序为:
x=0 : pi/100 : 2*pi;
y1=sin(x);
y2=cos(x);
plot(x,y1,x,y2, '--');
legend('sin(x)','cos(x)');
结果为:
5.1.6 对函数自适应采样的绘图函数
fplot函数则可自适应地对函数进行采样(在指定的范围内绘制函数图像),能更好地反应函数的变化规律。
fplot函数的调用格式为:
- fplot(fname,lims,tol,选项)
其中fname为函数名,以字符串形式出现,lims为x,y的取值范围,tol为相对允许误差,其系统默认值为2e-3。选项定义与plot函数相同。
例12:用fplot函数绘制f(x)=cos(tan(πx))的曲线。
fplot('cos(tan(pi * x))',[ 0,1],1e-4)
或可先建立函数文件fct.m,其内容为:
function y=fct(x)
y=cos(tan(pi*x));
用fplot函数调用fct.m函数,其命令为:
fplot(‘fct’,[0 1])
结果为:
注:以后的版本中(我使用的是2017b版本)将会删除 fplot 的字符输入。请改用 fplot(@(x)cos(tan(pi.*x)))
例13:绘制分段函数
使用 hold on
绘制多个线条。使用 fplot
的第二个输入参数指定绘图区间。使用 'b'
将绘制的线条颜色指定为蓝色。在相同坐标区中绘制多个线条时,轴范围会调整以容纳所有数据。
fplot(@(x) exp(x),[-3 0],'b')
hold on
fplot(@(x) cos(x),[0 3],'b')
hold off
grid on
结果为:
5.1.7 极坐标图
polar函数用来绘制极坐标图,其调用格式为:
- polar(theta,rho,选项)
其中theta为极坐标极角,rho为极坐标矢径,选项的内容与plot函数相似。
例 14:绘制r=sin(t)cos(t)的极坐标图,并标记数据点。
t=0 : pi/50 : 2*pi;
r=sin(t) .* cos(t);
polar(t,r,'-*');
结果为:
5.2 三维图形
5.2.1 绘制三维网格图
函数格式:
- mesh(x,y,z,c)
其中:x,y控制X和Y轴坐标, 矩阵z是由(x,y)求得Z轴坐标,(x,y,z)组成三维空间的网格点,c用于控制网格点颜色
例 15:
%绘制三维网格曲面图
x=[0 : 0.15 : 2*pi];
y=[0 : 0.15 : 2*pi];
z=sin(y') * cos(x); %矩阵相乘
mesh(x,y,z);
结果为:
例16
%画出由函数形成的立体网状图:
x=linspace(-2, 2, 25); % 在x轴上取25点
y=linspace(-2, 2, 25); % 在y轴上取25点
[xx,yy]=meshgrid(x,y); % xx和yy都是25x25的矩阵
zz=xx .* exp(-xx .^ 2-yy .^ 2); % 计算函数值,zz也是25x25的矩阵
mesh(xx, yy, zz); % 画出立体网状图
结果为:
5.2.2 绘制三维曲面图
三维曲面图各线条之间的补面用颜色填充。surf函数和mesh函数的调用格式一致。
函数格式:
- surf (x,y,z)
其中x,y控制X和Y轴坐标,矩阵z是由x,y求得的曲面上Z轴坐标。
例17:
% 绘制三维曲面图
x=[0 : 0.15 : 2*pi];
y=[0 : 0.15 : 2*pi];
z=sin(y') * cos(x); %矩阵相乘
surf(x,y,z);
结果为:
例 18:
%剔透玲珑球
[X0,Y0,Z0]=sphere(30); %产生单位球面的三维坐标
X=2 * X0;Y=2 * Y0;Z=2 * Z0; %产生半径为2的球面的三维坐标,若加上常数则是圆心
surf(X0,Y0,Z0); %画单位球面
shading interp %采用插补明暗处理
hold on; mesh(X,Y,Z);hold off %画外球面
hidden off %产生透视效果
axis off %不显示坐标轴
结果为:
例 19:
%卫星返回地球的运动轨线示意。
R0=1; %以地球半径为一个单位
a=12 * R0;b=9 * R0;T0=2 * pi; %T0是轨道周期
T=5 * T0;dt=pi / 100;t=[0 : dt : T]';f=sqrt(a ^ 2 - b ^ 2); %地球与另一焦点的距离
th=12.5 * pi / 180; %卫星轨道与x-y平面的倾角
E=exp(-t / 20); %轨道收缩率
x=E .* (a * cos(t) - f);y=E .* (b * cos(th) * sin(t));z=E .* (b * sin(th) * sin(t));
plot3(x,y,z,'g') %画全程轨线
[X,Y,Z]=sphere(30);X=R0 * X;Y=R0 * Y;Z=R0 * Z; %获得单位球坐标
grid on,hold on,surf(X,Y,Z),shading interp %画地球
x1=-18 * R0;x2=6 * R0;y1=-12 * R0;y2=12 * R0;z1=-6 * R0;z2=6 * R0;
axis([x1 x2 y1 y2 z1 z2]) %确定坐标范围
view([117 37]),comet3(x,y,z,0.02),hold off %设视角、画运动轨线
结果为:
5.2.3 绘制等高线图
例 20:
%多峰函数peaks的等高线图
[x,y,z]=peaks(30); %产生一个凹凸有致的曲面,包含了三个局部极大点及三个局部极小点
contour3(x,y,z,16);%以x,y,z建立含16条等高线的三维等高图
xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis');
title('contour3 of peaks')
结果为:
注:MATLAB中peaks函数用法主要为:
- z=peaks;返回一个49*49的矩阵
- z=peaks(n);返回一个n*n的矩阵
5.2.4 动画设计
例 21:
%动画功能函数:getframe、moviein和movie
%播放一个不断变化的眼球程序。
m=moviein(20); %建立一个20个列向量组成的矩阵
for j=1:20
plot(fft(eye(j+10))) %绘制出每一幅眼球图并保存到m矩阵中
m(:,j)=getframe;
end
movie(m,10);%以每秒10幅的速度播放画面
结果为:
6 MATLAB文件导入
MATLAB支持工作区的保存。用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入。保存工作区可以通过菜单进行,也可以通过命令窗口进行。
6.1 数据导出
(1)保存整个工作区
选择File菜单中的Save Workspace As…命令,或者单击工作区浏览器工具栏中的Save,可以将工作区中的变量保存为MAT文件。
(2)保存工作区中的变量
在工作区浏览器中,右击需要保存的变量名,选择Save As…,将该变量保存为MAT文件。
(3)利用save命令保存
该命令可以保存工作区,或工作区中任何指定文件。该命令的调用格式如下:
save:将工作区中的所有变量保存在当前工作区中的文件中,文件名为 matlab.mat,MAT文件可以通过load函数再次导入工作区,MAT函数可以被不同的机器导入,甚至可以通过其他的程序调用。
save('filename'):将工作区中的所有变量保存为文件,文件名由filename指定。如果filename中包含路径,则将文件保存在相应目录下,否则默认路径为当前路径。
save('filename', 'var1', 'var2', ...):保存指定的变量在 filename 指定的文件中。
save('filename', '-struct', 's'):保存结构体s中全部域作为单独的变量。
save('filename', '-struct', 's', 'f1', 'f2', ...):保存结构体s中的指定变量。
save('-regexp', expr1, expr2, ...):通过正则表达式指定待保存的变量需满足的条件。
save('..., 'format'),指定保存文件的格式,格式可以为MAT文件、ASCII文件等。
6.2 数据导入
(1)MATLAB中导入数据通常由函数load实现,该函数的用法如下:
load:如果matlab.mat文件存在,导入matlab.mat中的所有变量,如果不存在,则返回error。
load filename:将filename中的全部变量导入到工作区中。
load filename X Y Z ...:将filename中的变量X、Y、Z等导入到工作区中,如果是MAT文件,在指定变量时可以使用通配符“*”。
load filename -regexp expr1 expr2 ...:通过正则表达式指定需要导入的变量。
load -ascii filename:无论输入文件名是否包含有扩展名,将其以ASCII格式导入;如果指定的文件不是数字文本,则返回error。
load -mat filename:无论输入文件名是否包含有扩展名,将其以mat格式导入;如果指定的文件不是MAT文件,则返回error。
(2)另一个导入数据的常用函数为importdata,该函数的用法如下:
importdata('filename'),将filename中的数据导入到工作区中;
A = importdata('filename'),将filename中的数据导入到工作区中,并保存为变量A;
importdata('filename','delimiter'),将filename中的数据导入到工作区中,以delimiter指定的符号作为分隔符;
与load函数不同,importdata将文件中的数据以结构体的方式导入到工作区中。
7 MATLAB脚本与函数文件
脚本文件 ---回答如何解决一个任务,指出一堆命令按怎样的顺序依次执行完成一项任务;回答“how?”
函数文件---定义输出参数和输入参数的对应关系(函数关系),以方便在外部调用,回答“WHAT?”
两者的简要区别如下:
脚本文件:
- 多条命令的综合体
- 没有输入、输出变量
- 使用MATLAB基本工作空间
- 没有函数声明行
函数文件:
- 常用于扩充MATLAB函数库
- 可以包含输入、输出变量
- 运算中生成的所有变量都存放在函数工作空间
- 包含函数声明行
脚本文件可以理解为简单的M文件,脚本文件中的变量都是全局变量。函数文件是在脚本文件的基础之上多添加了一行函数定义行,其代码组织结构和调用方式与对应的脚本文件截然不同。函数文件是以函数声明行“function...”作为开始的,其实质就是用户往MATLAB函数库里边添加了子函数,函数文件中的变量都是局部变量,除非使用了特别声明。函数运行完毕之后,其定义的变量将从工作区间中清除。而脚本文件只是将一系列相关的代码结合封装,没有输入参数和输出参数,即不自带参数,也不一定要返回结果。而多数函数文件一般都有输入和输出变量,并见有返回结果。
参考:
https://www.cnblogs.com/Ran_Ran/archive/2010/12/11/1903070.html
https://www.cnblogs.com/hxsyl/archive/2012/10/10/2718380.html
https://www.cnblogs.com/haore147/p/3633573.html