附录
MATLAB简介
这里介绍MATLAB一些入门知识,包括MATLAB桌面和窗口,MATLAB 命令格式、数据格式、数据文件和变量管理,MATLAB的数组和矩阵运算,MATLAB的字符串、元胞和结构等数据类型,MATLAB的程序设计方法,MATLAB作图方法在线帮助的使用和程序文件和目录的管理等。
一、MATLAB桌面
启动MATLAB后,就进入MATLAB的桌面,图1为MATLAB6.1的默认(Default)桌面。第一行为菜单栏,第二行为工具栏,下面是三个最常用的窗口。右边最大的是命令窗口(Command Window),左上方前台为发行说明书窗口(Launch pad),后台为工作空间(Workspace),左下方为命令历史(Command History)后台为当前目录(Current Directory)。
1.窗口
(1)命令窗口
该窗口是进行MATLAB操作最主要的窗口。窗口中“>>”为命令输入提示符,其后输入运算命令,按回车键就可执行运算,并显示运算结果.。
图1
(2)发行说明书窗口
发行说明书窗口是MATLAB 所特有的,用来说明用户所拥有的Mathworks 公司产品的工具包、演示以及帮助信息。
(3)工作空间
在默认桌面,位于左上方窗口前台,列出内存中MATLAB 工作空间的所有变量的变量名、尺寸、字节数。用鼠标选中变量,击右键可以打开、保存、删除、绘图等操作。
(4)当前目录
在默认桌面,位于左下方窗口后台,用鼠标点击可以切换到前台。该窗口列出当前目录的程序文件(.m )和数据文件(.mat )等。用鼠标选中文件,击右键可以进行打开、运行、删除等操作。
(5)命令历史(Command History )
该窗口列出在命令窗口执行过的MATLAB 命令行的历史记录。用鼠标选中命令行,击右键可以进行复制、执行(Evaluate Selection )、删除等操作。
除上述窗口外,MATLAB 常用窗口还有编程器窗口、图形窗口等。
二、数据和变量
1.表达式
在命令窗口作一些简单的计算,就如同使用一个功能强大的计算器,使用变量无须预先定义类型。
例如,设球半径为r=2,求球的体积33
4
r V π=。
>>r=2 %表达式将2赋予变量r
r= %系统返回r的值
2
>>v=4/3*pi*r^3 %pi为内置常量π,乘方用^表示
v=
33.5103
几个表达式可以写在一行,用分号(;)或逗号(,)分割,用分号(;)使该表达式运算结果不显示,而逗号(,)则显示结果。也可以将一个长表达式分在几行上写,用三点(…)续行。
若需要修改已执行过的命令行,可以在命令历史中找到该命令行复制,再粘贴至命令窗口修改。也可以直接使用键盘↑↓调出已执行过的命令行修改。
2.数据显示格式
MATLAB默认的数据显示格式为短格式(short):当结果为整数,就作为整数显示;当结果是实数,以小数点后四位的长度显示。若结果的有效数字超出一定范围,以科学计数法显示(如3.2000e-006表示6
?)。数据显示格式可使
10
2.3-
用命令Format改变。例如:
>> format long;v %长格式,16位
v =
33.51032163829112
>> format short;v %短格式
v =
33.5103
>> format rational;v %有理格式,近似分数
v =
6501/194
3.复数
MATLAB中复数可以如同实数一样,直接输入和计算。例如:
>> a=1+2i;b=5-4*i;c=a/b
c =
-0.0732 + 0.3415i
4.预定义变量
MATLAB有一些预定义变量(表1),启动时就已赋值,可以直接使用,如前我们使用的圆周率pi和虚数单位i.
的功能暂不能使用。当这些用户变量被清除(clear)或MATLAB重新启动后,这些功能得以恢复。
5.用户变量
MATLAB变量名总以字母开头,以字母、数字或下划线组成,区分大小写,有效字符长度为63个。如A,a,a1,a_b都是合法的,且a与A表示不同变量。在Command Window中使用的变量一旦被赋值,就会携带这个值存在于工作空间,直到被清除或被赋予新的值。
ans是系统一个特别的变量名。若一个表达式运算结果没有赋予任何变量,系统自动用ans存放答案。例如:
>> A=5+4i;b=5-4*i;B=1;A*b %没有定义A*b的输出变量
ans =
41 %ans来接受计算结果,注意这是大写A与小写b的乘积,尽管我们可以使用工作空间来查询和清除变量,但使用下列命令方式更快捷:
>> whos %查询Workspace中的变量列表
Name Size Bytes Class
A 1x1 16 double array (complex)
B 1x1 8 double array
a 1x1 16 double array (complex)
ans 1x1 8 double array
b 1x1 16 double array (complex)
c 1x1 16 double array (complex)
Grand total is 6 elements using 80 bytes
>> A %查询变量A的值
A =
5.0000 + 4.0000i
>> clear A %清除变量A
>> A %再查询A的值,已经不存在了
??? Undefined function or variable 'A'.
>> clear %清除Workspace中所有变量
>> whos %Workspace中已没有任何变量了
三、数组和矩阵运算
MATLAB基本数据单元是无需指定维数的数组。数组运算是MATLAB最鲜明的特点,一方面可以使得计算程序简明易读,另一方面可以提高计算速度。
1.数组的输入
最常用的数组是双精度数值数组(double array)。一维数组相当于向量,二维数组相当于矩阵,一维数组可以视为二维数组的特例。二维数组的第一维称为“行”,第二维称为“列”。MATLAB数组无需预先定义维数。直接输入数组的元素,用中括号([])表示一个数组,同行元素间用空格或逗号分隔,不同行间用分号或回车分隔,例如:
>> clear;a=[1,2,3;4,5,6;7,8,9]
a =
1 2 3
4 5 6
7 8 9
或
>> a=[1 2 3 %这种方式特别适用于大型矩阵
4 5 6
7 8 9]
a =
1 2 3
4 5 6
7 8 9
对于等差数列构造的一维数组,可用冒号运算生成,也可用函数linspace生成。
>> b=0:3:10 %初值:增量:终值
b =
0 3 6 9
>> b=0:10 %增量为1可省略
b =
0 1 2 3 4 5 6 7 8 9 10
> >b=10:-3:0 %递减
b =
10 7 4 1
>> b=linspace(0,10,4) %将区间[0,10]等分为4-1=3份
b =
0 3.3333 6.6667 10.0000
>> length(b) %查询b的长度
ans =
4
>> b(3) %查询b的第三个元素
ans =
6.6667
>> b([1,end]) %查询b的首和尾元素
ans =
0 10
二维数组元素双下标编址按通常方式,单下标编址按列排序。
>> size(a) %查询数组a的尺寸
ans =
3 3
>> a(3,2),a(6)
ans =
8
ans =
8
>> c=a([1 3],[2 3]) %提取a的第一、第三行和第二、第三列(分块矩阵)
c =
2 3
8 9
>> d=a(2,:) %提取a的第二行
d =
4 5 6
>> a(:) %将a所有元素按单下标顺序排为列向量
ans =
1
4
7
2
5
8
3
6
9
一些特殊的二维数组可以用函数产生,例如:
>> a=zeros(2,4) %生成2行4列零矩阵
a =
0 0 0 0
0 0 0 0
>> b=ones(1,4) %生成1行4列1矩阵
b =
1 1 1 1
>> c=[a;b] %拼接
c =
0 0 0 0
0 0 0 0
1 1 1 1
>> c(2,1)=100 %修改部分元素
c =
0 0 0 0
100 0 0 0
1 1 1 1
>> reshape(c,2,6) %按2行6列重排矩阵元素
ans =
0 1 0 0 1 0
100 0 1 0 0 1
注意:数组下标对应矩阵的行和列,编址一律从1开始,不能用0.
矩阵输入也可用“load”命令从外部数据文件导入
2.数组运算
数组运算是指数组对应元素之间的运算,也称点运算。矩阵的乘法、乘方和除法有特殊的数学含义,并不是数组对应元素的运算,所数组乘法、乘方和除法的运算符前特别加了一个点。特别要区分数组运算在乘法、乘方和除法上的意义和表示上与矩阵运算的不同。
>> A.*B %注意不是A*B
ans =
0 -1
0 -2
>> A.\B,A./B
Warning: Divide by zero.
ans =
0 -1.0000
Inf -0.5000
Warning: Divide by zero.
ans =
Inf -1
0 -2
>> A.^2
ans =
1 1
0 4
>> 1./A
Warning: Divide by zero.
ans =
1.0000 -1.0000
Inf 0.5000
3.矩阵运算
矩阵是一个二维数组,所以矩阵的加、减、数乘等运算与数组运算是一致的。但是有两点需要注意:
(1)对于乘法、乘方和除法等三种运算,矩阵运算与数组运算的运算符及含义不同:矩阵运算按线性变换定义,使用通常符号;数组运算按对应元素运算
定义,使用点运算符;
(2)数与矩阵加减、矩阵除法在数学上是没有意义的,在MATLAB中为简便起见,定义了这两类运算,其含义见表3.
>> 100+A
ans =
101 102
103 104
>> A*B,A.*B %注意矩阵运算和数组运算的区别
ans =
8 5
20 13
ans =
4 6
6 4
>> A\B,B/A,A.\B,B./A %注意矩阵运算和数组运算的区别
ans =
-6.0000 -5.0000
5.0000 4.0000
ans =
-3.5000 2.5000
-2.5000 1.5000
ans =
4.0000 1.5000
0.6667 0.2500
ans =
4.0000 1.5000
0.6667 0.2500
4.数学函数
数组的数学函数也是按每个元素的运算,使用通常的函数符号,常用数学函数见表4
>> B=exp(A)
B =
54.5982 0.3679
20.0855 7.3891
>> C=fix(B)
C =
54 0
20 7
>> D=sin(C)
D =
-0.5588 0
0.9129 0.6570
>> E=log(D)
Warning: Log of zero.
E =
-0.5820 + 3.1416i -Inf
-0.0911 -0.4201
5.关系与逻辑运算
MATLAB的关系运算和逻辑运算符都是对于元素的操作,其结果是特殊的逻辑数组(logical array)表5,“真”用1表示,“假”用0表示,而逻辑运算中,所有非零元素作为1(真)处理。
A =
-2 -1 0 1 2 3 4
B =
4 3 2 1 0 -1 -2
>> A>B
ans =
0 0 0 0 1 1 1
>> A==B
ans =
0 0 0 1 0 0 0
>> A&B %逻辑运算中,所有非零元素作为1(真)处理
ans =
1 1 0 1 0 1 1
>> A|B
ans =
1 1 1 1 1 1 1
>> find(abs(A)>=2) %返回绝对值大于或等于2的元素的下标
ans =
1 5 6 7
>> any(abs(A)>5) %若存在绝对值大于5的元素,返回1
ans =
>> all(abs(A)>5) %若所有元素绝对值大于5,返回1
ans =
四、字符串、元胞和结构
除数值(double)以外,常用的数据类型还有字符(char)、元胞(cell)和结构(structure),由此进一步组成字符数组(char array)、元胞数组(cell array)和结构数组(structure array).
1.字符串
MATLAB字符串用单引号对来标识,其数据类型为字符数组。
>> a1='Hello everyone'
a1 =
Hello everyone
>> a2='各位好' %注意单引号,不是双引号
a2 =
各位好
>> a=[a1,'.',a2,'.'] %字符串拼接
a =
Hello everyone.各位好.
>> size(a)
ans =
1 19 %共19个字符
>> double(a)
ans =
Columns 1 through 8
72 101 108 108 111 32 101 118
Columns 9 through 16
101 114 121 111 110 101 46 47351 Columns 17 through 19
52923 47811 46 %中文ASCII码很大>> a=char(ans)
a =
Hello everyone.各位好.
数字字符串与数值之间也可以用num2str和str2num转换。一个数组的元素要么都是数值,要么都是字符串,数值转换后可以与字符串出现在同一数组中。
>> a=12;b=sqrt(a);
>> ['a=',num2str(a),',a的开方=',num2str(b)]
ans =
a=12,a的开方=3.4641
MATLAB命令可以定义成一个字符串,使用eval可以使该字符串所表达的MATLAB命令得到执行。
>> fun='x.^2.*sin(x)';
>> x=1;eval(fun)
ans =
0.8415
>> x=1:3;eval(fun)
ans =
0.8415 3.6372 1.2701
2.元胞和结构
不管是数值数组还是字符数组,其数据结构必须是整齐的。首先数值和字符不能混合,其次小数组拼接成大数组时,其尺寸(size)必须相符(agree)。例如:>> A=['first';'second'] %错误
??? Error using ==> vertcat
All rows in the bracketed expression must have the same
number of columns.
将不同类型、不同尺寸的数组,加大括号({}),可构成一个元胞。几个元胞可以构成元胞数组。
>> Ac1={'first';1:3};Ac2={'second';[1 2;3 4]};
>> Ac=[Ac1,Ac2]
Ac =
'first' 'second'
[1x3 double] [2x2 double]
>> size(Ac)
ans =
2 2
>> Ac(2,1) %小括号,查询Ac的第二行第一列元素
ans =
[1x3 double]
>> Ac{2,1} %大括号,查询Ac的第二行第一列元素的具体内容
ans =
1 2 3
一个结构通过“域”来定义,比元胞更丰富、更灵活。几个结构可以合成一个结构数组,但这些结构的域名必须一致。
>> As1.f1='first';As1.f2='second';As2.f1=1:3;As2.f2=[1 2;3 4];
>> As=[As1;As2]
As =
2x1 struct array with fields:
f1
f2
>> size(As) %注意其size结果与元胞数组不同
ans =
2 1
>> As(2,1).f1
ans =
1 2 3
>> As.f1
ans =
first
ans =
1 2 3
元胞数组与结构数组可以用struct2cell和cell2struct函数进行适当的转换。
>> Bc=struct2cell(As) %注意结果与Ac的不同
Bc =
'first' [1x3 double]
'second' [2x2 double]
>> Bs=cell2struct(Ac,{'one','two'},1) %定义域名,并指定取域名的维
Bs =
2x1 struct array with fields:
one
two
看一看Workspace有哪些类型,并观察其字节数。
五、程序设计
1.控制流
前面我们用的命令都是顺序结构的,对于复杂的计算,需要循环和分支等复杂的程序结构。MATLAB控制流语法都以end结尾。常用控制流见表6.
例1 计算
100
2
1
1
n
s
n
= =∑
>> clear;s=0;
>> for n=1:100
s=s+1/n/n;
end
>> s
s =
1.6350
2.M脚本文件
复杂程序结构在命令窗口调试保存都不方便,所以进行复杂的运算大都使用程序文件。从命令窗口用命令“edit”就进入MATLAB的程序编辑器窗口,用以编写用户的M文件。M文件可分为两类:M脚本文件和M函数文件。
将多条MATLAB语句写在编辑器中,并以.m文件保存在适当的目录中(这
个目录须为MATLAB的搜索目录),就得到一个M脚本。如我们将例1中的几条语句写在编辑器中,
保存为naega_1,然后在命令窗口执行:
>>naega_1
s=
1.6350
执行M脚本文件也可以在程序编辑器的Debug菜单选Run。使用编辑器也可打开和修改M文件、观察变量值、调试程序等。
注意:M文件名一律以字母开头,以字母、数字或下划线组成,不要含有空格、减号等,并要防止它与系统的变量名、系统内部的M函数名冲突。例如1.m,ega-1.m,ega.1.m都是不合法的。另外,别忘了每次修改程序后都要存盘。
3.M函数文件
M脚本文件没有参数传递功能,当我们需要修改程序中的某些变量值,必须修改M文件。而M函数文件使得我们可以进行参数传递。
% M函数naega_1f.m
function s=f(m)
s=0;
for n=1:m
s=s+1/n/n;
end
保存为naega_1f.m,在命令窗口执行:
>>clear;naega_1f(100),naega_1f(1000)
ans=
1.6350
ans=
1.6439
注意:在MATLAB中,使用M函数是以该函数的磁盘文件主名调用,而不是文件中的函数名,但为了增强程序可读性,最好两者同名。
M函数不能像M脚本那样在编辑器窗口用Debug\run执行,因为M函数必须给予输入参数值。M函数常常被M脚本或其他M函数调用。
4.函数句柄和内嵌函数
M函数除了直接用其函数名调用之外,也可以作为一个参数调用。调用时使用所谓函数句柄(handle)方式。MATLAB命令feval用于执行函数的参数方式。例如:
>>fname=@naega_1f;feval(fname,1000)
ans=
1.6439
比较简单的函数表达式可以不用写成外部M函数,而是用更简捷的内嵌
>> fname=inline('sum(1./(1:n).^2)','n')
fname =
Inline function:
fname(n) = sum(1./(1:n).^2)
>> feval(fname,1000)
ans =
1.6439
5.其他
(1)注释
为了增强程序的可读性,程序中常常需要注释语句。M文件开头一般应有一段注释。注释用%开头,顶格书写,对本行后面字符起作用,说明文件的功能和使用方法。注释语句不参与运算,只起说明作用。使用Help可看到。注释符(%)也常用于程序调试。
(2)对话
Input在交互式执行程序中用于提示键盘输入,Disp用于屏幕显示。
例2 编写一个脚本文件,使对键盘提示输入的向量求得元素总和。
% M文件naega_2.m
%用途:本程序提示输入一个向量,并求得元素总和
%用法:输入向量用中括号,元素之间用逗号
clear A;
A=input('Enter a vector:');
d=sum(A);
disp(['The sum is',num2str(d)]);
然后在命令窗口执行:
>>naega_2
Enter a vector:[1 2 3 4]
The sum is 10
>>help naega_2
用途:本程序提示输入一个向量,并求得元素总和
用法:输入向量用中括号,元素之间用逗号
(4)子函数
M函数中允许使用子函数。M函数中第一个function为主函数,其他function 为子函数。子函数只能被同一文件的主函数和其他子函数调用,不能被外部函数调用。
(5)全程变量与局部变量
M函数中所有变量为局部变量,而脚本文件中所有变量同命令窗口的命令一样都是全程变量。M函数变量值传递主要通过其输入输出变量,但也可以用global定义全程变量。它的意义与普通全程变量稍有区别,只对有定义的文件起作用。
(6)nargin与nargout
在M函数内,nargin表示该函数的输入变量个数,nargout表示该函数的输出变量个数。
(7)提高速度
MATLAB 软件主要缺点是执行循环语句时速度慢。好的M 程序文件应尽量使用数组运算和内部函数,少用循环语句,以提高运算速度。尽管MATLAB 数组无须定义尺寸,但经常改变数组尺寸会影响速度,采取一些预分配方法可提高运算速度。另外,减少运行过程中不必要的结果显示也可提高速度。
(8)强行中断
使用快捷键Ctrl+C 可以强行中断程序运行。
例3 编写一个M 函数,对于任意输入的向量x ,可以计算下列分段函数值构成的向量:
2,1()1,1132,1x x f x x x x ?>?
=-<≤??+≤-?
naeag_3b.m 是根据MATLAB 数组运算设计的程序,程序简短且速度快,数组维数越高,效率改进越显著。下列程序中tic 表示计时开始,toc 为读数。
>>clear;tic;x=-2:0.0005:2;y=naega_3a(x);toc %时间因电脑不同而有区别 elapsed_time = 1.0400
>> clear;tic;x=-2:0.0005:2;y=naega_3b(x);toc elapsed_time = 0.4400
六、作图
依次将(1,1),(4,3),(2,-1),(5,2)连接起来得一条折线(图2)
图2
图形显示在图形窗口。在图形窗口可以使用File菜单保存(Save)为M文件,导出(Export)为图形文件。也可利用图形窗口Edit菜单Copy figure作为图片复制到剪贴板,从而进一步粘贴到Word或其他应用程序中。
图形的线型、标记、颜色均可根据要求设定。常用的见表8
表8 图形元素设定
例4 两个一元函数31y x x =--和0.2
sin(5)y x x
=在区间-1 % M 文件naega_4.m fplot('x^3-x-1',[-1,2]); hold on; %在作下一幅图时保留已有图像 x=-1:0.2:2; y=abs(x).^2.*sin(5*x); %注意数组运算 plot(x,y,':ro'); hold off; %释放hold on >> xa=6:8;ya=1:4; %生成x,y 各自的节点 >> [x,y]=meshgrid(xa,ya); %生成X-Y 面上网格 >> z=x.^2+y.^2; %计算X-Y 面上各网格点的z 轴高度 >> mesh(x,y,z) >> [x,y,z] ans = 6 7 8 1 1 1 37 50 65 6 7 8 2 2 2 40 53 68 6 7 8 3 3 3 45 58 73 6 7 8 4 4 4 52 65 80 这3组数据构成空间网面的12格点坐标 例5 二元函数图2 2 exp()z x x y =-- %M 文件 naega_5.m clear;close; % close 关闭当前图形窗口 xa=-2:0.2:2;ya=xa; [x,y]=meshgrid(xa,ya); z=x.*exp(-x.^2-y.^2); mesh(x,y,z);pause %网格图,pause 暂停直到按任意键 surf(x,y,z);pause %网面图 contour(x,y,z);pause %等高线图 contour(x,y,z,[0.1 0.1]); %z=0.1的一条等高线 图形说明和定制 0.2 0.2 c o s 2s i n 0202t t x e t y e t t z ππ--?=?? ?=<? ?=?? %M 文件naega_6.m clear;close; t=0:0.1:20;r=exp(-0.2*t);th=0.5*pi*t; x=r.*cos(th);y=r.*sin(th);z=sqrt(t); subplot(1,2,1) plot3(x,y,z); title('螺旋线'); subplot(1,2,2) plot3(x,y,z); axis([-1 1 -1 1 0 4]) grid on; 七、在线帮助和文件管理