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
- MATLAB 学习(六)M文件和面向对象编程
- 学习java和面向对象编程(1)- 入门
- 学习面向对象编程和面向接口编程的区别?
- 面向过程编程和面向对象编程
- 面向对象编程和面向接口编程
- 过程性编程和面向对象编程
- 过程性编程和面向对象编程
- 面向过程编程和面向对象编程
- 面向对象编程和面向协议编程
- 编程范式分析(一)面向过程和面向对象
- Windows编程和面向对象技术
- C#和面向对象编程语言[1]
- 面向过程和面向对象的编程
- 《面向过程和面向对象的编程》
- 面向过程和面向对象的编程
- EXT JS入门和面向对象编程
- 面向过程和面向对象编程
- 编程思想:面向对象和面向过程
- Spring框架学习(6):bean的作用域
- app专项的网络测试和Fiddler弱网模拟
- 【LeetCode】01 Matrix 解题报告
- 快速排序
- TCP/IP 数据流套接字传输注意事项
- MATLAB 学习(六)M文件和面向对象编程
- QT开发用ffmpeg将图片制作成视频
- 关于MySql 持续积累,进行记录
- js面向对象编程:if中可以使用那些作为判断条件呢?
- 浅析web服务器与浏览器的实现原理
- GIT
- 快速插入2000万数据
- 删除vboxnet0的方法
- Android监听软键盘回车事件