数值分析上机实验指导书 下载本文

>> 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.

29

类型 循环语句 循环语句 分支语句 分支语句 中断语句 中断语句 中断语句 中断语句 表6 MATLAB常用控制流 语法 解释 for 循环变量=数对于循环变量依次取数组中的值,循环执行命令组, 组直到循环变量遍历数组。数组最常用的形式是命令组 初值:增量:终值 end while 条件式, 当条件式满足,循环执行命令组直到条件不满 命令组 足。使用While语句要注意避免出现死循环 end if 条件1, 如果条件式1满足,则执行命令组1,且结束该 命令组1; 语句;否则检查条件式2,若满足则执行命令组elesif 条件2, 2,且结束该语句;??;若所有条件式都不满 命令组2; 足,则执行命令组k,并结束该语句。最常用的??; 格式是 else, if 条件式 命令组k; 命令组 end end switch 分支变量 若分支变量的取值1,则执行命令组1,且结束case 值1, 该语句;若分支变量的取值2,则执行命令组2, 命令组1; 且结束该语句;??若分支变量不取所列出的case 值2, 值,则执行命令组k 命令组2; ??; otherwise 命令组k; end pause 暂停执行,直到击键盘,pause(n)为暂停n秒后再继续 break 中断执行,用在循环语句内表示跳出循环 return 中断执行该程序,回到主调函数或命令窗口 error(字符串) 提示错误并显示字符说明 100例1 计算s??1 2nn?1>> clear;s=0;

>> for n=1:100 s=s+1/n/n; end >> s s =

1.6350 2.M脚本文件

复杂程序结构在命令窗口调试保存都不方便,所以进行复杂的运算大都使用程序文件。从命令窗口用命令“edit”就进入MATLAB的程序编辑器窗口,用

30

以编写用户的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函数文件以function开头,格式如下: function 输出变量=函数名(输入变量) 语句 例如,写函数文件: % 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函数,而是用更简捷的内嵌

31

(inline)函数方式。inline的使用格式如下: fun=inline(expr,arg1,agr2,…) expr为函数表达式字符串,arg1,arg2,….为自变量名字符串 例如: >> 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

32