Chapter 1 概述
1.1 简介
MATLAB是“矩阵实验室(Matrix Laboratory)”的缩写,它是一种以矩阵运算为基础的交互式程序语言,是专门针对科学与工程中计算和绘图的需求而开发的。
1.2 特点
MATLAB是以解释方式工作的,即它对每条语句解释后立即执行,若有错误也立即作出反应,便于编程者马上改正。
1.3 界面
1.菜单栏
菜单栏包括7个菜单项。其中,File用于相关文件的处理,Edit实现命令窗口的编辑操作,Debug用来调试程序,Parallel用来进行配置管理和并行计算设置,Desktop用来是指窗口的实现方式,Window用来关闭所有使用的编辑器窗口或选择活动窗口,Help用来选择打开不同的帮助系统。
2.Command Window(命令窗口)
键盘上的ESC可恢复命令输入的空白状态;方向键中的上箭头可调出上一行的历史命令。 想查某函数的帮助时,如linespace函数,键入doc linespace即可。
3.Workspace(工作空间)
储存着当前窗口中所有变量的名称、类型、字节数等内容。
4.Command history(历史命令)
5.Current folder(当前文件夹)
修改默认目录的方法:对桌面上的MATLAB快捷方式右键选“属性”,将起始位置改为“C:\Users\冯亚飞\Documents\MATLAB”即可。
6.Details
如果Editor中有“%% 通信程序”这样的题头时,它会在Details窗口内显示出来。
7.Editor(文本编辑窗口)
可在Command Window中直接键入edit来新建一个Editor。
快捷键:ctrl+R,选中行加上注释符“%”;ctrl+T,去掉注释符;ctrl+回车,运行区域内的程序(所谓区域指的是用两个注释符“%%”分隔开的区域);
8.Figure(图形窗口)
1.4 退出方法
键入exit,另一种是直接单击右上角的×号,后者是非正常退出,该过程中所有的输入
命令将不记录在Command history窗口中,所以应当尽量避免使用。
Chapter 2 基本语法
2.1 变量及其赋值
2.1.1 矩阵及其元素的赋值
MATLAB内部只有一种数据格式,那就是双精度(即64位)二进制,对应于十进制16位有效数和±308次幂。
MATLAB中的变量或常量都代表矩阵,标量应看做1×1的矩阵。
矩阵的值放在方括号中,同一行中各元素之间以逗号或空格分开,不同行则以分号隔开,语句的结尾可用“回车”或逗号,此时会立即显示运算结果。如果不希望显示结果,就以分号结尾。
变量的元素用圆括号中的数字(也称为下标)来注明,一维矩阵(也称数组或向量)中的元素用一个下标表示;二维矩阵可有两个下标数,以逗号分开。如果赋值元素的下标超出原来矩阵的大小,矩阵的行列会自动扩展,并且跳空的元素被自动地赋值0.这种自动扩展维数的功能只适用于赋值语句。在其他语句中若出现超维调用的情况,MATLAB将给出出错提示。
给全行赋值可用冒号“:”。
若想抽去矩阵的某一行或列,可以利用空矩阵[ ]的概念。比如:A([2 4 5]),:)=[ ],表示抽去矩阵A的2、4、5行。
2.1.2 复数
MATLAB中的每一个元素都可以是复数,实数是复数的特例。
运算符“’”表示把矩阵作共轭转置,即把它的行列互换,同时把各元素的虚部反号。函数conj则只把各元素的虚部反号,即只取共轭。所以若想求转置而不要共轭,就要用conj和“’”结合起来完成。
2.1.3 基本矩阵和函数
(1)zeros(m,n),ones(m,n),rand(m,n)随机数矩阵,randn(m,n)正态随机数矩阵,eye(n)单位矩阵(方阵)。
(2)linespace(a,b,n)。均分向量,在a与b之间均分地产生n个点值,形成1×n元向量。
(3)size(y)是求多维矩阵y的各维长度,一般有两个输出量。length(x)是返回一维矩阵x的长度,只有一个输出量。length不区分列或行。
(4)magic(n)。魔方矩阵的特点是其元素由1到n×n的自然数组成;每行每列及两对角线上的元素之和均等于(n3+n)/2。
(5)eye(n)。单位矩阵是n×n元的方阵,其对角线上的元素为1,其余元素均为0。(对角线指的是从左上角到右下角)
2.2 矩阵的初等运算
如果想针对矩阵中对应位置的元素进行运算时,一定要用点乘、点除或点幂。
2.2.1矩阵的乘法
m×p阶矩阵A与p×n阶矩阵B的乘积C是一个m×n阶矩阵,它的任何一个元素 C(i, j)的值为A阵的第i行和B阵的第j列对应元素乘积的和。对于标量A,B,因为n,p,m均为1,矩阵乘法就退化为普通数的乘法。
注意矩阵乘法的左乘和右乘的结果一般不同,只有单位矩阵例外。如eye(m)*A=A*eye(m)=A。
2.2.2矩阵的除法
矩阵除法是MATLAB从逆矩阵的概念引申来的。先介绍逆矩阵的定义,对于任意n×n阶方阵A,如果能找到一个同阶的方阵V,使
A*V=I
其中,I为n阶的单位矩阵eye(n),则V就是A的逆矩阵,用数学符号表示为V=A-1。
逆矩阵V存在的条件是A的行列式det(A)不等于0。在MATLAB中可用函数inv求逆矩阵,键入V=inv(A),就可得到A的逆矩阵V。
现在来看方程D*X=B,设X为未知矩阵,等式两端同时左乘以inv(D),即
Inv(D)*D*X=inv(D)*B
因为等式左端inv(D)*D=I,而I*X=X,所以上式成为
X=inv(D)*B=D\B
把D的逆矩阵左乘以B,MATLAB就记作D\,称之为“左除”。从D*X=B的阶数检验可知,B与D的行数相等。因此,左除时的阶数检验条件是:两矩阵的行数必须相等。
如果原始方程的未知数向量在左而系数矩阵在右,即X*D=B,
则按上述同样的方法可以写出
X=B*inv(D)=B/D
把D的逆矩阵右乘以B,MATLAB就记作/D,称之为“右除”。同理,右除时的阶数检验条件是:两矩阵的列数必须相等。
矩阵除法可以用来方便地解线性方程组。但是当方程数少于未知数个数时,仍然可用除法符号求出解,但它只是一个特殊解。
2.3 元素群运算
元素群运算指的是矩阵中所有元素按照单个元素进行运算。为了与矩阵作为整体的运算符号相区别,要在运算符“*、/、\、^”前加一点符号“.”,以表示进行的是元素群运算。
2.3.1 数组及其赋值
MATLAB提供了两种为等间隔数组赋值的简易方法。
(1)t=[初值:增量:终值]。如t=[0:0.02:1]
增量可为负值;当增量为1时,可略去增量值。
(2)用linespace函数,具体参见2.1.3。
有时要求自变量按等比级数赋值,在设频率轴时往往如此,可用logspace函数。如键入 W=logspace(0,1,11)。它的意义是将10的0至1次幂之间按幂等分(即数是等比的)为11个点。
2.3.2元素群函数
下表是初等数学函数库中的常用函数,均可用于元素群运算,即其自变量都可以是任意阶的矩阵。
初等数学函数库(elfun)
2.4 逻辑判断及流程控制
2.4.1 关系运算
所谓关系运算,是指两元素之间数值的比较,它是对矩阵的各个元素进行元素群运算,一共有六种可能,具体如下:
关系运算的结果只有两种可能,即0(假)或1(真)。 同样用于元素群,可得出同阶的0—1矩阵。逻辑量只能取0(假)和1(真)两个值。为了(不全为假)。 2.4.3流程控制语句 (1)if语句 (2)while语句 (3)for语句 其结构形式为 for k=初值:增量:终值语句组A, end (4)switch语句
另外break是终止循环的命令,在循环语句中,可用它在一定条件下跳出循环。在多重循环中,break只能使程序跳出包含它的最内部的那个循环。
2.5 基本绘图方法
2.5.1 x-y直角坐标中的二维曲线——plot命令
(1)plot(y)——输入一个数组的情况
以y中元素的下标作为x坐标,y中元素的值作为y坐标,一一对应画在x-y坐标平面图上,
(2)plot(x,y)——输入两个数组的情况
2.5.2线型、点型和颜色
为了设定线型,在输入变量组的后面加一个引号,在引号内部放入线型和颜色的标志符,如 plot(x,y,’*b’,x1,y1,’:r’)。
具体可以键入doc linespec查询。
2.5.3 多条曲线的绘制
(1)plot(t,[y1,y2,…]) 其中t是向量,y=[y1,y2…]是矩阵。
(2)用hold命令
在画完一张图后用命令“hold on”保持住,再画下一条曲线。注意及时解除保持状态,即键入“hold off”,否则,以后的图都会叠加在此图上,造成混乱。
(3)plot(x,y,’*b’,x1,y1,’:r’)
(4)plotyy(t1,y1,t2,y2)
plotyy设有两个纵坐标,以便绘制两个y尺度不同的变量,但x轴仍只能用一个比例尺。左纵坐标是对y1的,右纵坐标是对y3的。曲线的标注用gtext命令。
2.5.4 其他二维绘图命令
(1)subplot(n,m,p)命令:将图形窗口分成n×m个子图,在第p个子图处绘制图形。 (2)其他坐标系
①polar(theta,rho)命令:极坐标绘图,以角度theta为一个坐标,单位是弧度,另外一个坐标是矢径rho。
②loglog绘出纵、横坐标刻度均为log10的对数图。
③semilogx使用半对数刻度绘图,x轴为log10刻度,y轴为线性刻度。
④semilogy使用半对数刻度绘图,y轴为log10刻度,x轴为线性刻度。
(3)复数的绘图
当plot(z)中的z为复数单变量时(即含有非零的虚部),MATLAB把复数的实部作为x坐标,虚部作为y坐标进行绘图,即相当于plot(real(z),imag(z))。如果是双变量如plot(t,z),则z中的虚数部分将被丢弃。要在复平面内绘出多条图线,必须用hold命令,或把多根曲线的实部和虚部明确地写出,作为plot函数的输入变元,即
plot(real(z),imag(z),real(z2),imag(z2))。
(4)坐标比例和尺寸的设定——axis命令
v=axis,返回当前图形边界的四元行向量,即v=[xmin,xmax,ymin,ymax]。
axis(v)(其中v是一个四元向量),将坐标轴设定在v规定的范围内。
axis的另外一个功能是控制图形的纵横比。axis(‘square’)或axis(‘equal’)使屏幕上x与y的比例尺相同,在这种方式下,斜率为1的直线的倾斜角为45°。
(5)图形窗口中的直接编辑
指的就是图形窗口顶部的菜单和按钮。可以自行摸索试验以掌握他们的功能和用法,深入一些的问题需参阅手册“Using MATLAB Graphics”。
(6)set命令,具体可在命令窗口键入”doc plot”查询。程序示例如下
plot(x,y);
set(gca,'XTick',-2*pi:pi/2:2*pi);
set(gca,'XTickLabel',{'-2pi','-3pi/2','-pi','-pi/2','0','pi/2','pi','3pi/2','2pi'});
axis([-2*pi,2*pi,-1,1]);
gridon;
2.5.5 三维曲线和曲面
具体用法待定。
2.5.6 动画
具体待定。示例程序:
2.6M文件及程序调试
M文件可分为两种:一种是主程序,也称为主程序文件(Script File),是由用户为解决特定的问题而编制的;另一种是子程序,也称为函数文件(Function File),它必须由其他M文件来调用,函数文件可以进行递归调用(即自己调用自己)。
2.6.1 主程序文件
其格式特征如下:
(1)用clear,close all,clc等语句开始,以避免其他已执行过的程序残留数据对本程序的影响。
前几行通常是对程序用途的说明,利用注释符“%”来注释,特别是在运行时对用户输入数据的要求,更要叙述清楚,不然别人看不懂也用不成,连自己日后也会遗忘。
(2)以下是程序的主体。如果文件中有全局变量,即在子程序中与主程序共用的变量,应在程序的起始部分注明,语句是 Global 变量名 1 变量名 2…
键入程序时最好从头到尾用英文,不要插入汉字。汉字可在程序调试完毕后加入。注意在菜单项【Text】下,选【Smart Indent】项可以自动对程序进行缩进排版。
(3)文件名不允许用汉字。
2.6.2 人机交互命令
(1)pause(n)命令:程序执行到此处暂停n秒,再继续执行。如果没有括号参数,则等待用户键入任意键后才继续执行。
(2)input(‘提示文字’):程序执行到此处暂停,在屏幕上显示引号中的提示字符串,要求用户输入数据。如程序为x=input(‘x=’),则屏幕上显示“x=”,输入的数据将赋值给x。数据输入后程序继续执行。imput命令也可以接受字符,其格式为y=input(‘提示文字’,’s’),此时y将等于输入的字符串。
(3)ctrl+C键:强行停止程序运行的命令。在发现程序运行有错或运行时间太长时,可用此方法中途终止它。
2.6.3 函数文件
函数文件是用来定义子程序的。它与程序文件的主要区别有三点:
①由function起头,后跟的函数名必须与文件名相同;
②有输入输出变量,可进行变量传递;
③除非用global声明,程序中的变量均为局部变量,运行后不保存在workspace中。
文件的第一条语句定义了函数名、输入变元以及输出变元。如果没有这条语句,该文件就成为程序文件,而不再是函数文件了。输入变元和输出变元都可以有若干个,但必须在第一条语句中明确地列出。
程序中的运算都采用元素群算法,以保证此函数可按元素群调用。MATLAB中几乎所有的函数都能用元素群运算,所以我们自编的子程序,也要尽量满足元素群算法的要求,即子程序主体中均用点乘、点幂等运算符。
2.6.4 内联函数和匿名函数
(1)用上节方法来定义函数,必须在主程序之外重新建立一个函数文件,这不大方便。MATLAB还提供了一种简便的、直接在主程序文件中定义函数的方法,称为内联函数。它的调用格式为fun=inline(‘函数内容’,自变量列表)
例如f(x,y)=x2+xy2就可以用
f=inline(‘x.^2+x.*y.^2’,’x’,’y’)
来直接定义。不过这样的格式只能用来定义比较简单的、用一条语句就能求出结果的函数形
式。
(2)匿名函数式MATLAB 7.x 版本给出的新的函数定义形式,它的基本格式为 fun=@(自变量列表)函数内容 例如 f=@(x,y)x.^2+x.*y.^2
可见,它和inline函数很相似,但键入量更少,更简洁。更重要的是,该函数允许直接使用MATLAB工作空间中的变量。例如,在MATLAB工作空间中已经有了a和b,则匿名函数f=@(x,y)cos(a*x+b*y)就可以成立,无需把a、b列入变量列表中,所以使数学函数的定义更加方便。 2.6.5 快捷键 【Tab】(或【Ctrl+]】)——增加缩进(对多行有效) 【Ctrl+[】--减少缩进(对多行有效)
【Ctrl+I】--自动缩进(即自动排版,对多行有效) 【Ctrl+R】――注释(对多行有效) 【Ctrl+T】――去掉注释(对多行有效) 【F12】――设置或取消断点 【F5】――运行程序
Chapter 3 MATLAB的开发环境和工具
3.1 MATLAB与其他软件的接口关系
3.1.1 日期和时间命令
有关时间和日期方面的命令,都是从操作系统中提取数据的。这些命令见下表。
时间和日期函数库(timefun)
下面介绍如何确定做某种计算所需的时间。例如,想看看生成1个100×100阶随机矩阵并作求逆运算所需的时间,可以用下列三组语句之一: (1)t0=clock; y=inv(ran(100,100)); etime(clock,t0) (2)t=cputime; y=inv(ran(100,100)); cputime-t (3)tic; y=inv(ran(100,100)); toc
这三种方法的差别在于:第一种方法要先后两次提取年、月、日、时、分、秒的数据,并将他们相减;第二种方法以开机时间为基准;第三种方法则用tic把秒表置零,求得的toc就
是经历的时间。
3.2 MATLAB的文件管理系统
3.2.1 安装后的MATLAB文件管理系统
安装后的MATLAB根目录(通常表示为MATLABroot)下,至少有bin、extern、help、toolbox这四个子目录,其中子目录bin包含了MATLAB所要用到的二进制文件。启动MATLAB的执行文件matlab.exe就在这个目录中,双击这个文件就可以启动MATLAB软件。子目录extern包含了MATLAB所要用到的外部文件。子目录help包含了MATLAB的各种帮助文件,如果有下一级子目录pdf_doc,则其中将包括MATLAB及其工具箱的说明书,那是十分有用的资料。子目录toolbox包含了MATLAB的各种函数库及已装入的作为下一级子目录的工具箱名称等,它至少应有local和matlab两项,其中matlab(注意用的是小写)又有20多个子目录,分别是本书第1~4章介绍的MATLAB中的基本函数库。通常在MATLAB根目录下,还会自动建立一个用户的子目录work,以便把用户自编的程序存在这个子目录下,免得与系统中原有的文件混淆。