MATLAB 学习(六)M文件和面向对象编程

来源:互联网 发布:淘宝卖家怎么投诉盗图 编辑:程序博客网 时间:2024/06/07 01:07

MATLAB内容:脚本;函数(一般函数、内联函数、子函数、私用函数、方法函数);函数句柄的创建和使用;程序调试和剖析;数据结构(类、对象);重载和继承;面向对象编程。

1、M文本编辑器

1.1 创建新的M文件,启动编辑器

三种方法:(a)指令窗中运行指令eidt;(b)点击指令窗的工具条新建图标;(c)利用MATLAB指令窗【File:New】子菜单,右拉菜单选择“M-file”项。

1.2 打开已有的M文件

三种方法:(a)指令窗中运行指令edit filename (待打开文件名,可不带扩展名);(b)点击打开文件图标;(c)指令窗【File:Open】子菜单,在弹出文件夹中点选所需打开文件。

1.3 经编写或修改后,文件保存

点击编辑器工具条的保存图标,或选取编辑器的【file:Save】子菜单,选择保存目录和文件名的选择,完成保存。

2、MATLAB控制流

五种控制程序流的结构:for循环结构、while循环结构、if-else-end分支结构,switch-case结构、try-catch结构。

2.1 for循环结构

function demo2(a,b)%This is my second example.%a Define the limit of variable x.%b Define the limit of variable y.clf;x = -a:0.2:a; y = -b:0.2:b;for i=1:length(y)    for j=1:length(x)        if x(j)+y(i)>1            z(i,j) = 0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j));        elseif x(j)+y(i)<=-1            z(i,j) = 0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j));        else z(i,j) = 0.7575*exp(-y(i)^2-6.*x(j)^2);        end    endendaxis([-a,a,-b,b,min(min(z)),max(max(z))]);colormap(flipud(winter));surf(x,y,z);
在命令行中,输入

demo2(2,3)
即将2传给参数a,3传给参数b。


2.2 while循环结构

% This is Fibonacci.mat.a(1)=1;a(2)=1;i=2;while a(i)<=10000    a(i+1) = a(i-1)+a(i); %当现有元素仍然小于10000的时候,求解下一个元素。    i=i+1;end;i,a(i),
运行脚本文件名:Fibonacci

结果如下:

2.3 if-else-end分支结构

%用for循环指令来寻求Fibonacci数组中第一个大于10000的元素。n=100;a = ones(1,n);for i=3:n    a(i) = a(i-1)+a(i-2);    if a(i)>=10000        a(i),        break;       %跳出所在的一级循环    end;end,i
运行脚本文件名:Fibonacci

结果如下:

2.4 switch-case结构

%划分区域:满分100,优秀90-99,良好80-89,及格60-69,不及格<60for i=1:10;a{i}=89+i;b{i}=79+i;c{i}=69+i;d{i}=59+i;end;c=[d,c];Name={'Jack','Marry','Peter','Rose','Tom'};  %元胞数组Mark={72,83,56,94,100};Rank=cell(1,5);%创建一个含5个元素的架构数组S,它有三个域。S=struct('Name',Name,'Marks',Mark,'Rank',Rank);%根据学生的分数,求出相应的等级。for i=1:5    switch S(i).Marks        case 100            S(i).Rank = '满分';        case a            S(i).Rank = '优秀';        case b            S(i).Rank = '良好';        case c            S(i).Rank = '及格';        otherwise            S(i).Rank = '不及格';    endend%将学生姓名,得分,登记等信息打印出来disp(['学生姓名','得分','等级']);disp('')for i=1:5;    disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]);end;          

2.5 控制程序流的其他常用指令

1、return指令

通常,当被调函数执行完后,MATLAB自动地把控制转至主调函数或指令窗。

若在被调用函数中插入return指令强制MATLAB结束执行该函数,并把控制转出。

2、input和Keyboard指令

input指令:将MATLAB的控制权暂时交给用户。此后用户通过键盘键入数值、字符串、表达式。并经过“回车”把键入内容输入工作空间,同时把“控制权”交还给MATLAB。

keyboard指令:MATLAB将“控制权”交给键盘,用户可以从键盘输入各种合法的MATLAB指令,只有当用户使用return指令结束输入后,“控制权”才交还给程序。(与input不同:它允许输入任意多个MATLAB指令,而input只能输入赋给变量的“值”:数值、字符串或元胞数组等)。

3、yesinput指令

提供一个缺省输入值,并可以对输入范围进行检查。

4、break指令

包含有该指令的while、for指令的终止。通过使用break指令,可不必等待循环的自然结束。

5、error和warning指令

在编写M文件时,常用的警示指令:

error('message'):显示出错信息message,终止程序;

errortrap:错误发生后,程序继续执行与否的双位开关;

lasterr:显示MATLAB自动判断的最新出错原因并终止程序;

warning('message'):显示警告信息message,程序继续运行;

lastwarn:显示MATLAB自动给出的最新警告程序继续运行。


3、脚本文件和函数文件

3.1 M脚本文件:

一串按用户意图排列而成的MATLAB指令集合。

脚本文件运行后,所产生的所有变量都驻留在基本工作空间(Base workspace)中,只有clear指令加以清除。

3.2 M函数文件:

“黑箱”,外界只看到传给它的输入量和送出来的计算结果。

特点:第一行总是以“function”引导的函数申明行Function declaration line”。该行还罗列出函数与外界的联系的全部“标称”输入输出总量。

每当函数文件运行,MATLAB会专门为它开辟一个临时工作空间(Context workspace),该空间称为函数工作空间(Function workspace)。所有中间变量都存放在函数工作空间中,当执行完文件最后一条指令或遇到return语句,结束该函数文件的运行,同时该临时函数空间及变量被清除。

3.3 M文件的一般结构

典型的M函数文件的结构如下:

  • 函数申明行(Function declaration line):位于函数文件的首行,关键字function开头,函数名以及函数的输入输出宗量都在这一行被定义;
  • H1行(the first help text line):紧随函数申明行之后,第一个以%开头的注释行,大写体的函数文件名和运用关键词简要描述函数功能;
  • 在线帮助文本区(Help text):H1行及其之后的连续的以%开头的所有注释行构成整个在线帮助文本,通常包括:函数输入输出宗量的含义,调用格式说明;
  • 编写和修改记录:与在线帮助文本区相隔一个“空”行;以%开头;标志编写及修改该M文件的做着和日期;版本记录,用作软件档案管理;
  • 函数体(Function body):为清晰起见,与前面的注释以“空”行相隔,这部分内容由实现该M函数文件功能的MATLAB指令组成,接收输入宗量进行程序流控制,得到输入宗量。

4、P码文件

4.1 语法分析过程和伪代码

一个M文件首次被调用(运行文件名,或被M文本编辑器打开时),MATLAB将首先对该M文件进行语法分析(Parse),并把生成的相应内部伪代码(Psedocode,简称P码)文件存放在内存中。此后,当再次调用该M文件时,将直接调用该文件在内存中的P码文件,而不会对原码文件重复进行语法分析。

(MATLAB的分析器(Parser)总是把文件连同被它调用的所有函数M文件一起变成P码文件)。

4.2 P码文件的预生成

P码文件不是仅当M文件被调用时才可产生。P码文件也可以被预先生成。

pcode FunName                        在当前目录上生成FunName.p;

pcode FunName -inplace           在FunName.m所在目录上生成FunName.p

4.3 在内存中P码文件的列表和清除

inmem                          罗列出内存中所有P码文件;

clear FunName             清除内存中的FunName.p P码文件;

clear functions             清除内存中的所有P码文件。

4.4 MALTAB搜索过程

指令cow:按步骤搜索。

5、变量的检测传递和权限使用函数

5.1 输入输出宗量检测指令

nargin:在函数体内,用于获取实际输入宗量;(nargin为“number of input arguments”的缩写。 在matlab中定义一个函数时, 在函数体内部,nargin是用来判断输入变量个数的函数。)

nargout:在函数体内,用于获取实际输出宗量;(nargout的作用是在matlab中定义一个函数时, 在函数体内部,nargout指出了输出参数的个数(nargin指出了输入参数的个数)。

nargin('fun'):获取'fun'指定函数的标称输入宗量数;

nargout('fun'):获取‘fun’指定函数的标称输出宗量;

inputname(n):在函数体内使用,给出第n个输入宗量的实际调用变量名。

【说明】使用nargin,nargout的目的:与程序流控制指令配合,对于不同数目的输入输出宗量数,函数可完成不同的任务。

【注意】nargin,nargout,inputname本身都是函数,而不是变量,所以用户不能使用赋值指令对它们进行处理。

5.2 “变长度”输入输出宗量

plot指令的输入宗量可以任意多。如调用格式plot(x,y,'PropertyName1','PropertyValue1','PropertyName2','PropertyValue2',....),就允许使用任意多的“属性名/属性值对”精细指定plot绘图的用线。

varargin     “变长度”输入宗量列表;

varargout   “变长度”输出宗量列表。

【说明】

(1)编写M函数文件时,函数申明行中的“变长度”宗量必须被放置在“普通”宗量之后。

(2)varargin的工作机理

varargin本身是元胞数组。

M文件被调用时,函数输入变量的分配规则是:输入变量依先后次序逐个对应分配给M函数文件输入宗量列表中那些被明确定义的“普通”输入宗量;然后,将剩余的输入变量依次逐个分配到varargin元胞数组的元胞中。因此,varargin元胞数组的长度取决于分配到的输入变量数。

所谓“变长度”:指的是varargin的长度随分配到的输入变量数而变。


6、串演算函数

指令、表达式、语句、以及由它们综合组成的M文件,是用户为达到自己计算目的时所最常使用的形式。为提高计算的灵活性,MATLAB还提供一种利用字符串进行计算的能力。利用字符串可以构成函数,可以在运行中改变所执行的指令,可以被泛函指令调用实现比较复杂的求零点、求极值等运算。

6.1 eval

y = eval('CEM')                  %执行CEM指定的运算

y = eval('CEM1','CEM2')  %先执行CEM1指定的计算,若出错,执行CEM2

[y1,y2,...] = eval('CEM')  %执行对CEM代表的函数文件调用,并输出计算结果

【说明】

(1)eval指令的输入宗量必须是字符串

(2)构成字符串的CEM,可以是MATLAB任何合法的指令、表达式、语句或M文件名

(3)第三种格式中CEM只能是(包含输入宗量的)M函数文件名

6.2 feval

[y1,y2,...]=feval('FN',arg1,arg2,...)   用参量arg1,arg2等执行FN函数指定的计算

【说明】

(1)‘FN’只是函数名。

(2)在既可以使用eval,又可以使用feval的情况下,feval运行效率更高。

(3)feval主要用来构造“泛函”型M函数文件(fmin,ezplot)。


7、函数句柄

函数句柄(Function handle)是新数据类型,保存着为该函数创建句柄时路径、视野、函数名,以及可能存在的重载方法。

定义函数句柄的两种方法

7.1 @符号

【eg.11】

hsin = @sin      %创建函数句柄class(hsin)      %类型判断size(hsin)       %借助指令functions观察内涵CC = functions(hsin)      %同名重载函数观察

7.2 利用转换函数str2func

【eg.1】

>> fhandle = str2func('sin');    %创建函数句柄>> ys = sin(pi/4);               %函数直接调用>> yfold = feval('sin',pi/4)     %feval指令的“老式”调用yfold =    0.7071 >> yfnew = feval(fhandle,pi/4)   %feval指令的“新式”调用yfnew =    0.7071


0 0
原创粉丝点击