文档库 最新最全的文档下载
当前位置:文档库 › matlab使用手册

matlab使用手册

matlab使用手册
matlab使用手册

附录

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;

七、在线帮助和文件管理

相关文档