好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

Matlab编程基础a.ppt

96页
  • 卖家[上传人]:鲁**
  • 文档编号:577624337
  • 上传时间:2024-08-22
  • 文档格式:PPT
  • 文档大小:963.02KB
  • / 96 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • MATLABMATLAB编程基础编程基础讲述的主要内容:§流程控制§脚本文件§函数文件§子函数§私有函数§M文件的调试 MATLABMATLAB编程基础(续)编程基础(续)概述流程控制脚本文件函数文件M文件调试M文件性能分析小结 4.1 4.1 概述概述nMATLAB的工作模式§指令驱动模式§通常MATLAB以指令驱动模式工作,即在MATLABM命令行窗口下用户输入单行指令时, MATLAB立即处理这条指令,并显示结果,这就是MATLAB命令行方式§命令行方式程序可读性差,而且不能存储,当处理复杂问题和大量数据时很不方便§M文件模式§将MATLAB语句构成的程序存储成以m为扩展名的文件,然后再执行该程序文件,这种工作模式称为程序文件模式§程序文件不能在指令窗口下建立,因为指令窗口只允许一次执行一行上的一个或几个语句 概述(续)概述(续)§ MATLAB通过M语言来实现完整的编写应用程序的能力§ M语言§ M语言是一种解释性语言,利用该语言编写的代码 仅能被MATLAB接受,被MATLAB解释、执行§ M语言文件可以分为脚本文件(命令文件)和函数文件§ 一个M语言文件就是由若干MATLAB的命令组合在一 起构成的。

      § M语言文件是标准的纯文本格式的文件,其文件扩 展名为.m§ 使用M文件可以将一组MATLAB命令组合起来,通过 一个简单的指令就可以执行这些命令 概述(续)概述(续)§ MATLAB提供了meditor编辑器编辑M文件§ 在MATLAB命令行窗口中键入指令edit,则可启动 meditor编辑器>> edit 概述(续)概述(续)§ 通过“File”菜单中的“New”子菜单下的“M-file”命令来启 动meditor编辑器§ 直接单击MATLAB用户界面工具栏上的新建按钮 来启动meditor编辑器 概述(续)概述(续)§ M文件有两类独立的M文件 —— 脚本(Scripts)可调用M文件 —— 函数(Functions) MATLABMATLAB编程基础(续)编程基础(续)4.1 概述4.2 流程控制4.3 脚本文件4.4 函数文件4.5 M文件调试4.6 M文件性能分析4.7 小结 4.2 4.2 流程控制流程控制§程序流程控制包含控制程序的基本结构和语法 §结构化的程序主要有三种基本的程序结构§顺序结构 指所有组成程序源代码的语句按照由上至下的次序依次执行,直到程序的最后一个语句。

      §选择结构 依照不同的判断条件进行判断,然后根据判断的结果选择某一种方法来解决某一个问题§循环结构 就是在程序中某一条语句或多条语句重复多次的运行§MATLAB语言的程序结构与其它高级语言是一致的,分为顺序结构、选择结构、循环结构 流程控制(续)流程控制(续)4.2.1 选择结构4.2.2 循环结构4.2.3 break语句和continue语句4.2.4 提高运算性能 4.2.1 4.2.1 选择结构选择结构§当判断某一条件是否满足,根据判断的结果来选择不同的解决方法时,就需要使用选择结构§MATLAB的条件判断可以使用if语句或者switch语句 4.2.1 4.2.1 选择结构选择结构4.2.1.1 if语句§if语句的三种基本语法结构§if(关系运算表达式) MATLAB语句 end§if(关系运算表达式) MATLAB语句A else MATLAB语句B end§if(关系运算表达式a) MATLAB语句A elseif (关系运算表达式b) MATLAB语句B else (关系运算表达式c) … end§if-elseif-else的语句结构可以嵌套使用 if(关系运算表达式a) if (关系运算表达式b) MATLAB语句A else MATLAB语句B end else if (关系运算表达式c) MATLAB语句C else MATLAB语句D end end 选择结构(续)选择结构(续)4.2.1.2 switch语句§switch语句用于处理多分支的选择§switch(表达式) case 常量表达式a:MATLAB语句A case 常量表达式b:MATLAB语句B … case 常量表达式m:MATLAB语句M otherwise:MATLAB语句N end§在MATLAB的switch语句中,程序仅仅执行符合条件的case分支§如果需要对多个条件使用同一个case分支时,则需要使用元胞数组与之配合 4.2.2 4.2.2 循环结构循环结构§在MATLAB中,包含两种循环结构§循环次数不确定的while循环§循环次数确定的for循环 循环结构(续)循环结构(续)1、while循环结构§while语句可以实现“当”型的循环结构§格式 while(表达式) MATLAB语句 end§特点是先判断循环条件,当循环条件成立,即表达式运算结果为“真”,再执行循环体§在循环过程中一定要有能够改变关系表达式或者布尔类型变量的值 循环结构(续)循环结构(续)2、for循环结构§使用for语句循环需要预先知道循环体执行的次数§格式 for index=start:increment:end MATLAB语句 end§index的取值取决于start和end的值§在for循环语句中,不仅可以使用行向量进行循环迭代的处理,也可以使用矩阵作为循环次数的控制变量§循环的索引值将直接使用矩阵的每一列,循环的次数为矩阵的列数 4.2.3 break4.2.3 break语句和语句和continuecontinue语句语句§break语句和continue语句的基本功能§当break语句使用在循环体中的时候,其作用是能够在执行循环体的时候强迫终止循环,即控制程序的流程,使其提前退出循环§使用方法: break;§continue语句出现在循环体中的时候,其作用是能够中断本次的循环体运行,将程序的流程跳转到判断循环条件的语句处,继续下一次的循环§使用方法: continue; 4.2.4 4.2.4 提高运算性能提高运算性能§M语言和其他的高级语言不同,由于采用了解释型语言,其执行效率低于编译性语言§提高运算性能§向量化运算§预分配存储空间§MATLAB加速器 提高运算性能(续)提高运算性能(续)1、向量化运算§向量化运算§不要使用循环结构操作矩阵的元素,应直接使用矩阵元素的索引或者矩阵运算的函数,即尽量将使用while循环或者for循环的语句结构转换成等价的向量或者矩阵运算 提高运算性能(续)提高运算性能(续)2、预分配存储空间§进行内存变量存储空间的预分配§内存预分配函数数据类型函数例子数值数组zerosY=zeros(1,10000)元胞数组cellY=cell(2,3)Y{1,3}=zeros(1:10000)Y{2,3}=‘string’结构数组struct、repmatY=repmat(struct(field,value),2,3) 提高运算性能(续)提高运算性能(续)例4-11disp([char(10),'使用内存预分配:'])pre_allo=zeros(10000,1);ticfor I=1:10000 pre_allo(I)=rand(1);endtocdisp([char(10),'不使用内存预分配:'])ticfor J=1:10000 not_pre_allo(J)=rand(1);endtoc 提高运算性能(续)提高运算性能(续)§使用内存预分配§MATLAB自动分配10000个连续的内存空间用于存储数据,MATLAB将一次创建足够的存储空间,然后依次赋值§不使用内存预分配§当I=1时,MATLAB将使用一块长度为一个单元大小的内存保存第一个随机数§当I=2时,MATLAB将寻找一块两单元大小的内存区,一个单元保存第一个随机数,第二个单元存放另一个随机数 …§当I=10000时,MATLAB寻找一块容纳10000单元的内存存放以前的9999个随机数,同时把最新的一个随机数加入进去 提高运算性能(续)提高运算性能(续)3、MATLAB加速器§MATLAB性能加速器能够明显改善循环结构、内建函数调用等方面的运行效率。

      §有些M语言元素不能被MATLAB性能加速器加速 MATLABMATLAB编程基础(续)编程基础(续)4.1 概述4.2 流程控制4.3 脚本文件4.4 函数文件4.5 M文件调试4.6 M文件性能分析4.7 小结 4.3 4.3 M M脚本文件脚本文件n包含MATLAB语言代码的文件称为 M文件,其扩展名为.mn脚本文件就是由一系列的MATLAB指令和命令组成的纯文本格式的M文件n脚本文件没有输入参数,也没有输出参数n执行脚本文件时,文件中的指令或者命令按照出现在脚本文件中的顺序依次执行 M M脚本文件(续)脚本文件(续)脚本文件示例% 注释行% M文件示例% “flower petal”% 以下为代码行% 计算theta=-pi:0.01:pi;rho(1,:)=2*sin(5*theta).^2;rho(2,:)=cos(10*theta).^3;rho(3,:)=sin(theta).^2;rho(4,:)=5*cos(3.5*theta).^3;for k=1:4 % 图形输出 subplot(2,2,k) polar(theta,rho(k,:))enddisp('程序运行结束!')§ 在脚本文件中,主要由注释行 和代码行组成§ M文件的注释行需要使用 %定义符§注释定义符仅能影响一行代码§ M文件的代码行是一些简 单的MATLAB指令或命令§ 命令可以完成相应的计算处理数据、绘制图形结果的操作§ 可以在脚本文件中调用其他的函数完成复杂的数学运算 M M脚本文件(续)脚本文件(续)在MATLAB命令行中运行该脚本文件:>> script_examp程序运行结束!MATLAB会出现相应的图形窗体 MATLABMATLAB编程基础(续)编程基础(续)4.1 概述4.2 流程控制4.3 脚本文件4.4 函数文件4.5 M文件调试4.6 M文件性能分析4.7 小结 4.4 4.4 函数文件函数文件§M语言函数文件能够接受用户的输入参数,进行计算,并将计算结果作为函数的返回值返回给调用者§在MATLAB中具有不同类型的函数文件§内建函数文件§系统M函数文件§系统MEX函数文件§用户自定义MEX函数文件§用户自定义的M函数文件 函数文件(续)函数文件(续)§MATLAB的内建函数文件MATLAB自定义的函数文件称内置函数文件。

      §调用内置函数的方法:使用函数名并给出相应的入口、出口参数即可 例如:sin.m函数 调用格式:y=sin(2*x)指令驱动模式 例:>> x=0 : 2*pi/180 : 2*pi; >> y=sin(2*x); >> plot(x,y)M文件模式假设存储的文件名为nzhswj.m>> nzhswj §用户自定义的M函数文件是由用户自己利用M语言编写的文件§系统M函数文件是由MATLAB提供的M语言函数文件函数文件(续)函数文件(续) §本节介绍4.4.1 基本结构4.4.2 输入输出参数4.4.3 子函数和私有函数4.4.4 局部变量和全局变量4.4.5 函数执行规则函数文件(续)函数文件(续) §M语言函数文件具有下面的不同部分§函数定义行§帮助§注释行§M语言代码4.4.1 4.4.1 基本结构基本结构 函数m文件的格式: function 返回变量 = 函数名(输入变量) 注释说明语句段 程序语句段特定规则:1) 函数m文件第一行必须以单词function作为引导词,必须遵循如下形式: function <因变量>=<函数名>(<自变量>)2) 程序中的变量均为局部变量,不保存在工作空间中,其变量只在函数运行期间有效。

      基本结构(续)基本结构(续) 001 function y=average(x)002 % AVERAGE 求向量元素的均值003 % 语法:004 % Y=average(X)005 % 其中,X是向量,Y为计算得到向量元素的均值006 % 若输入参数为非向量则出错007008 % 代码行009 [m,n]=size(x)010 % 判断输入参数是否为向量011 if(~((m==1)|(n==1))|(m==1&n==1))012 % 若输入参数不是向量,则出错013 error('Input must be a vector')014 end015 % 计算向量元素的均值016 y=sum(x)/length(x)基本结构(续)基本结构(续) §函数定义行001 function y=average(x)§包括§关键字function §函数输出参数y §函数名称average §函数输入参数x§函数名称定义要求§必须以字符开头,后面可以用字符、数字和下划线的组合构成函数名称§MATLAB对函数名称的长度有限定§函数的M文件名称最好和函数名称保持一致,若不一致,则调用函数时需要使用文件名称而非函数名称基本结构(续)基本结构(续) §帮助§M函数文件的帮助为紧随在函数定义行的注释行002 % AVERAGE 求向量元素的均值003 % 语法:004 % Y=average(X)005 % 其中,X是向量,Y为计算得到向量元素的均值006 % 若输入参数为非向量则出错基本结构(续)基本结构(续) §若在MATLAB命令行窗口中键入指令help average 则>> help average AVERAGE 求向量元素的均值 语法: Y=average(X) 其中,X是向量,Y为计算得到向量元素的均值 若输入参数为非向量则出错基本结构(续)基本结构(续) §注释行008 % 代码行010 % 判断输入参数是否为向量012 % 若输入参数不是向量,则出错015 % 计算向量元素的均值基本结构(续)基本结构(续) §M语言代码008 % 代码行009 [m,n]=size(x)010 % 判断输入参数是否为向量011 if(~((m==1)|(n==1))|(m==1&n==1))012 % 若输入参数不是向量,则出错013 error('Input must be a vector')014 end015 % 计算向量元素的均值016 y=sum(x)/length(x)§代码行需要完成具体的算法,实现用户的具体功能基本结构(续)基本结构(续) §MATLAB在定义输入输出参数时不需要指出变量的类型,而是将参数默认为双精度型§MATLAB在定义参数时,没有确定输入参数的维数或者尺寸§M语言的函数文件不仅可以有一个输入参数和一个返回值,还可以为M语言函数文件定义多个输入参数和多个输出参数4.4.2 4.4.2 输入输出参数输入输出参数 例4-15 多个输入输出参数的M函数function[avg,stdev,r]=ourstats(x,tol)% OURSTATS多输入输出参数示例% 该函数计算处理矩阵,得到相应的均值、标准差和矩阵的秩[m,n]=size(x);if m==1 m=n;end% Averageavg=sum(x)/m;% Sandad deviationstdev=sqrt(sum(x.^2)/m-avg.^2);% Ranks=svd(x);r=sum(s>tol);输入输出参数(续)输入输出参数(续) 运行例4-15>> A=[1 2 3;4 5 6]A = 1 2 3 4 5 6>> [a,s,r]=ourstats(A,0.1)a = 2.5000 3.5000 4.5000s = 1.5000 1.5000 1.5000r = 2>> [a,s]=ourstats(A,0.1)a = 2.5000 3.5000 4.5000s = 1.5000 1.5000 1.5000输入输出参数(续)输入输出参数(续)>> a=ourstats(A,0.1)a = 2.5000 3.5000 4.5000 调用该函数时,将输出参数依次写在一个向量中, 若输出参数的个数与函数定义的输出参数个数不一致时,将计算得到的前几个输出参数作为返回值, 若输出参数的个数等于指定的输出参数个数时,计算结果依次赋值给不同的变量。

      例4-16 nargout和nargin示例function c=testarg(a,b)% TESTARG检测输入输出参数个数% 该函数根据不同的输入输出参数个数进行相应的操作if (nargout~=1) disp('使用该函数必须指定一个输出参数!'); returnendswitch nargin case 0 disp('使用该函数必须指定一个输入参数!'); c=[]; return case 1 c=a.^2; case 2 c=a+b;end输入输出参数(续)输入输出参数(续)函数nargin用来获取函数的输入参数个数函数nargout用来获取输出函数个数 运行例4-16 >> A=[1 2 3];B=[2 3 5];>> testarg(A,B)使用该函数必须指定一个输出参数!>> C=testarg使用该函数必须指定一个输入参数!C = []>> C=testarg(A)C = 1 4 9>> D=testarg(A,B)D = 3 5 8>> E=testarg(A,B,C)??? Error using ==> testargToo many input arguments.输入输出参数(续)输入输出参数(续) §MATLAB的M函数文件还可以具有个数不确定的输入、输出参数§在定义M函数文件时,不指明输入、输出参数的个数,而是在程序中通过编写程序完成具体参数的确定§完成该功能主要依靠varargin和varargout函数§当函数的定义具有以下形式时 function y=function_name(varargin) 函数function_name可以接受任意个数的输入参数 使用varargin函数接受M函数参数时,将用户输入的所有参数构建成为一个元胞数组,该元胞数组中的元素为用户输入的参数§当函数的定义具有以下形式时 function varargout=function_name(n) 函数function_name可以输出任意个数的输出参数 使用varargout函数输出M函数参数时,需要将所有必要的输出参数传递给元胞数组,在传递参数时,还需要注意参数的顺序输入输出参数(续)输入输出参数(续) 例4-17 不确定的输入参数个数function y=varargin_example(varargin)% VARARGIN_EXAMPLE不确定输入参数例子str=sprintf('输入参数的个数:=%d',length(varargin));disp(str);y=0;% varargin的类型class(varargin)for i=1:length(varargin) %varargin为元胞数组 if(isnumeric(varargin{i})) % 将每个为数值数组的输入参数的第一个元素累加求和 y=y+varargin{i}(1); endend输入输出参数(续)输入输出参数(续) 运行例4-17 不确定的输入参数个数>> varargin_example输入参数的个数:=0ans =cellans = 0>> varargin_example('a',[1 2 3],3,rand(2,5))输入参数的个数:=4ans =cellans = 4.6154输入输出参数(续)输入输出参数(续)class(varargin)class(varargin) 例4-18 不确定的输出参数个数function varargout=varargout_example(varargin)% VARARGOUT_EXAMPLE不确定个数的输出参数% 判断输出参数的个数% 下面注释行中的代码执行有错误% str=sprintf('输出参数的个数:=%d',length(varargout));% 必须使用nargoutstr=sprintf('输出参数的个数:=%d',nargout);disp(str);if(nargout<=nargin) for k=1:nargout varargout{k}=varargin{nargin-k+1}; endend输入输出参数(续)输入输出参数(续)在程序中,判断输出参数的个数不能使用length函数,而需要使用nargout函数 运行例4-18 不确定的输出参数个数>> [a b]=varargout_example(1,2,3,4)输出参数的个数:=2a = 4b = 3输入输出参数(续)输入输出参数(续)if(nargout<=nargin) for k=1:nargout varargout{k}=varargin{nargin-k+1}; endEndnargin=4,nargout=2k=1:2 k=1 varargout{1}=varargin{4-1+1}=varargin{4} a=4 k=2 varargout{2}=varargin{4-2+1}=varargin{3} b=3 运行例4-18(续) 不确定的输出参数个数>> [a b]=varargout_example(3,4,5,9)输出参数的个数:=2a = 9b = 5输入输出参数(续)输入输出参数(续)if(nargout<=nargin) for k=1:nargout varargout{k}=varargin{nargin-k+1}; endEndnargin=4,nargout=2k=1:2 k=1 varargout{1}=varargin{4-1+1}=varargin{4} a=9 k=2 varargout{2}=varargin{4-2+1}=varargin{3} b=5 §子函数§同一个M函数文件可以包含多个函数,文件中的第一个M函数称为主函数,其余的函数称为子函数§M函数文件的名称一般与主函数的名称保持一致§每一个函数的开始都是函数定义行,函数的结尾是另一个函数的定义行的开始或者整个M文件的结尾(最后一个子函数的结尾是文件结束符)§子函数没有帮助,且只能被那些在定义子函数的M文件中定义的函数(包括主函数和其他子函数)调用,不能被其他M文件定义的函数调用4.4.3 4.4.3 子函数和私有函数子函数和私有函数 例4-20 子函数应用例子function[avg,med]=newstats(u) % 主函数% NEWSTATS计算均值和中间值n=length(u);avg=mean(u,n); % 调用子函数med=median(u,n); % 调用子函数function a=mean(v,n) % 子函数% 计算平均值a=sum(v)/n;function m=median(v,n) % 子函数% 计算中间值w=sort(v);if rem(n,2)==1 m=w((n+1)/2);else m=(w(n/2)+w(n/2+1))/2;end子函数和私有函数(续)子函数和私有函数(续) 运行例4-20 子函数应用例子>> x=1:11;>> [mean,mid]=newstats(x)mean = 6mid = 6>> x=1:10;>> [a,b]=newstats(x)a = 5.5000b = 5.5000子函数和私有函数(续)子函数和私有函数(续) §私有函数§私有函数被放置在名称为private的子目录中,仅能被那些位于private子目录的上一层目录中的函数调用§假设MATLAB的搜索路径中包含路径\ProjectA,那么所有位于\ProjectA\private路径下的函数,只能被在其上一层路径\ProjectA中的函数文件调用§不同父路径下的私有函数可以使用相同的函数名§MATLAB搜索函数时优先搜索私有函数§如果同时存在私有函数名func1.m和非私有函数名func1.m,则私有函数func1.m被优先执行§创建私有函数的方法§将需要设置为私有的函数拷贝到一个private子目录中子函数和私有函数(续)子函数和私有函数(续) 例4-21 私有函数示例function x=pmean(v,n)% MEAN私有函数例子% 将该函数文件保存在private子目录中,则该函数仅能被在上层目录中的函数文件调用disp('私有函数 pmean');x=sum(v)/n;子函数和私有函数(续)子函数和私有函数(续) 子函数和私有函数(续)子函数和私有函数(续) 子函数和私有函数(续)子函数和私有函数(续) 例4-21 调用私有函数的函数文件(newstats.m)function[avg,med]=newstats(u) % 主函数% NEWSTATS计算均值和中间值n=length(u);avg=mean(u,n); % 调用子函数avg1=pmean(u,n); % 调用私有函数med=median(u,n); % 调用子函数function a=mean(v,n) % 子函数% 计算平均值disp('子函数 mean');a=sum(v)/n;function m=median(v,n) % 子函数% 计算中间值w=sort(v);if rem(n,2)==1 m=w((n+1)/2);else m=(w(n/2)+w(n/2+1))/2;end子函数和私有函数(续)子函数和私有函数(续) 运行例4-21 调用私有函数的函数文件(newstats.m)>> x=1:10;>> [a b]=newstats(x)子函数 mean私有函数 pmeana = 5.5000b = 5.5000子函数和私有函数(续)子函数和私有函数(续) 私有函数和子函数比较子函数和私有函数(续)子函数和私有函数(续)函数类型子函数私有函数作用范围 同一个M函数文件在上层路径中的函数文件内结构保存在同一个M语言函数文件中,在M语言文件可以不包含任何子函数保存在子目录private下 §局部变量:在M函数内部声明并使用的变量§只在本函数范围内有效§仅能在函数调用执行期间被使用,一旦函数结束运行,则变量占用的内存空间自动释放,变量的数值也不存在了例4-22 局部变量的例子function local% LOCAL察看局部变量的例子x=rand(2,2);y=zeros(2,2);z='函数中的变量';u={x,y,z};disp(z)whos4.4.4 4.4.4 局部变量和全局变量局部变量和全局变量运行例4-22 局部变量的例子>> local函数中的变量Name Size Bytes Class u 1x3 256 cell array x 2x2 32 double array y 2x2 32 double array z 1x6 12 char arrayGrand total is 31 elements using 332 bytes>> whos>> §全局变量:在函数之外定义的变量§可以为本文件中其他函数所共用§MATLAB将全局变量保存在特殊的工作空间进行统一维护、管理§将变量声明为全局变量的方法§在使用变量前,用关键字global声明例:声明全局变量XY>> global XY>> whos Name Size Bytes Class XY 0x0 0 double array (global)Grand total is 0 elements using 0 bytes局部变量和全局变量(续)局部变量和全局变量(续) §使用global关键字创建全局变量时有三种情况§若声明为全局的变量在当前空间和全局空间都不存在,则创建一个新的变量,然后为这个变量赋值为空数组,该变量同时存在于局部工作空间和全局工作空间§若声明为全局的变量已经存在与全局空间中,则不会在全局工作空间创建新的变量,其数值同时赋值给局部工作空间中的变量§若声明为全局的变量存在于局部工作空间中,而全局工作空间不存在,则系统会提示一个警告信息,同时将局部的变量“挪”到全局工作空间中局部变量和全局变量(续)局部变量和全局变量(续) 例4-23 全局变量的例子>> % 创建全局变量>> global myx>> % 察看全局变量的信息>> whos Name Size Bytes Class myx 0x0 0 double array (global)Grand total is 0 elements using 0 bytes>> % 给全局变量赋值>> myx=10myx = 10>> % 察看全局变量的信息>> whos Name Size Bytes Class myx 1x1 8 double array (global)Grand total is 1 element using 8 bytes局部变量和全局变量(续)局部变量和全局变量(续) >> % 清除变量>> clear myx>> myx??? Undefined function or variable 'myx'.>> % 察看信息>> whos>> whos global Name Size Bytes Class myx 1x1 8 double array (global)Grand total is 1 element using 8 bytes局部变量和全局变量(续)局部变量和全局变量(续) >> % 在局部工作空间再次创建变量>> myx=23myx = 23>> % 察看变量的信息>> whosName Size Bytes Classmyx 1x1 8 double arrayGrand total is 1 element using 8 bytes>> whos globalName Size Bytes Classmyx 1x1 8 double array (global)Grand total is 1 element using 8 bytes局部变量和全局变量(续)局部变量和全局变量(续) >> % 将其修改为全局变量>> global myxWarning: The value of local variables may have been changed to match the globals. Future versions of MATLAB will require that you declare a variable to be global before you use that variable.>> % 察看变量的数值 >> myxmyx = 10局部变量和全局变量(续)局部变量和全局变量(续)将局部变量转变为全局变量的过程中原来的局部变量的数值丢失了 >> % 清除当前的工作空间>> clear>> whos>> whos globalName Size Bytes Classmyx 1x1 8 double array (global)Grand total is 1 element using 8 bytes>> % 清除所有的工作空间>> clear all>> whos>> whos global>> 局部变量和全局变量(续)局部变量和全局变量(续) §保留变量§这类变量在MATLAB中被声明为persistent§这类变量在函数退出时不被释放,当函数再一次被调用时,变量保留上次退出时的值§保留变量的特征§变量仅能在声明变量的函数内使用,其他函数不能直接使用保留变量§函数执行退出后,MATLAB不清除保留变量占用的内存§当函数被清除或者重新编辑后,保留的变量被清除局部变量和全局变量(续)局部变量和全局变量(续) 例4-24:function y=persistent_example(x) % PERSISTENT_EXAMPLE 保留变量使用示例 for i=1:x y=myfun; end function y=myfun % 子函数 % persistent关键字的使用 persistent count; % count记录函数调用的次数 if (isempty(count)) count=1; else count=count+1; end str=sprintf('第%d次调用该函数',count); disp(str); y=count;局部变量和全局变量(续)局部变量和全局变量(续) 运行例4-24:>> persistent_example(1)第1次调用该函数ans = 1>> persistent_example(3)第2次调用该函数第3次调用该函数第4次调用该函数ans = 4局部变量和全局变量(续)局部变量和全局变量(续)在MATLAB命令行中键入指令:>> clear all则所有的变量都会被清除>> persistent_example(3)第1次调用该函数第2次调用该函数第3次调用该函数ans = 3 §当用户在MATLAB命令行窗口键入一条命令或者执行M语言文件中包含的一条语句或者指令时,MATLAB解释器就负责解析用户的输入,并且给出相应的答案§MATLAB解释器解析命令按照一定的优先级进行§首先判断输入的命令是否为变量§若不是内存中的变量,判断输入的命令是否为MATLAB的内建函数§若不是内建函数,则判断输入的命令是否为子函数§若不是子函数,则判断输入的命令是否为私有函数§若不是私有函数,则判断输入的命令是否为MATLAB搜索路径中所包含的某个文件或函数§若在同一个路径下发现同名的三种类型的文件MEX文件、P代码文件和M代码文件,则优先执行MEX文件,其次是P代码文件,最后执行的是M语言文件4.4.5 4.4.5 函数执行规则函数执行规则 例4-25 MATLAB命令解析的优先级>> sin='This is a string!'sin =This is a string!>> sin(3)ans =i>> which sinsin is a variable.>> clear all>> sin(3)ans = 0.1411>> which sinsin is a built-in function.函数执行规则(续)函数执行规则(续)若需要了解具体调用的是哪一个对象,则可以使用which命令获取相应的信息 MATLABMATLAB编程基础(续)编程基础(续)4.1 概述4.2 流程控制4.3 脚本文件4.4 函数文件4.5 M文件调试4.6 M文件性能分析4.7 小结 4.5 M4.5 M文件调试文件调试§M文件的调试§可以在文件编辑器中进行§M语言的文件编辑器不仅仅是一个文件编辑器,还是一个可视化的调试开发环境§可以在命令行中结合具体的命令进行 M M文件调试(续)文件调试(续)§应用程序的错误§语法错误§包括词法或者文法的错误§运行时的错误§指程序运行过程中得到的结果不是用户需要的结果§程序的调试是在程序无法得到正确结果时进行程序修正的唯一手段§M文件是一种解释型语言,只有在运行过程中才能发现应用程序的错误 M M文件调试(续)文件调试(续)§M语言文件编辑器提供Breakpoints菜单进行程序调试 M M文件调试(续)文件调试(续)§Breakpoints菜单中的命令用来设置各种断点,只有设置了断点的应用程序才能进行调试§提供的自动断点§Stop if Error§Stop if Warning§Stop if NaN or Inf§Stop if All Errors§自动断点可以在程序中设置,当程序运行过程中发生了错误或警告,则程序运行中断,进如调试状态 M M文件调试(续)文件调试(续)例4-26 M文件调试代码——stats_error.m001 function [totalsum,average]=stats_error(input_vector)002 % STATS_ERROR-Calculates cumulative total &average003 totalsum=sum(input_vector);004 average=ourmean(input_vector);005006 function y=ourmean(x)007 % OUTMEAN-Calculates average008 [m,n]=size(x);009 if m==1010 m=n;011 end012 y=sum(input_vector)/m; M M文件调试(续)文件调试(续)§进行调试§在MATLAB环境中启动M文件编辑器,然后选择M文件编辑器中“Breakpoints”菜单下的“Stop if Error”命令§注意:此时不一定要将stats_error.m文件打开 M M文件调试(续)文件调试(续)§在MATLAB命令行窗口中键入指令>> [sum avg]=stats_error(rand(1,50))??? Undefined function or variable 'input_vector'.Error in ==> D:\MATLAB讲义\stats_error.m (ourmean)On line 12 ==> y=sum(input_vector)/m;K>> MATLAB命令行窗口处于调试状态,其命令行提示符为“K>>”,在该命令行提示符中可以键入MATLAB指令进行运算和处理。

      M M文件调试(续)文件调试(续)K>> whosName Size Bytes Class m 1x1 8 double array n 1x1 8 double array x 1x50 400 double arrayGrand total is 52 elements using 416 bytesK>> 如果要退出调试状态,则输入指令K>>dbquit M M文件调试(续)文件调试(续)应用与调试M文件的指令指令说明dbclear清除已经设置好的断点dbcont继续执行,等同于工具栏中的 按钮dbdown/dbup修改当前工作空间的上、下文关系dbquit退出调试状态dbstack显示当前堆栈的状态dbstatus显示所有的已经设置的断点dbstep执行应用程序的一行或者多行代码dbstop设置断点dbtype显示M文件代码和相应的行号 MATLABMATLAB编程基础(续)编程基础(续)4.1 概述4.2 流程控制4.3 脚本文件4.4 函数文件4.5 M文件调试4.6 M文件性能分析4.7 小结 4.6 M4.6 M文件性能分析文件性能分析§M文件性能分析器§利用M文件性能分析器可以有效地帮助用户了解具体的哪一行或哪一段代码占用了最多的计算时间§使用性能分析器的两种方法§通过命令行§通过图形用户界面 1 1、、通过图形用户界面通过图形用户界面§打开M文件性能分析器的图形用户界面§执行MATLAB的“Start”菜单中“MATLAB”子菜单下的“Profiler”命令,得到性能分析器的用户界面 通过图形用户界面(续)通过图形用户界面(续)§在MATLAB命令行窗口中键入指令 >> profview 则同样可以打开M文件性能分析器的图形界面 通过图形用户界面(续)通过图形用户界面(续)§进行性能分析§在“Run this code”下拉框中键入需要进行性能分析的MATLAB指令(array_vs_loops)§指令等同于在MATLAB命令行窗口下键入的执行应用程序的指令,而不是简单地键入文件名称§然后单击“Strat Profiling”按钮,则性能分析器通过运行指定的指令得出程序运行消耗的时间,并给出简要的总结 2 2、、通过命令行通过命令行§主要用到的函数——profile §函数使用方法: profile keywords§使用的步骤§首先在MATLAB命令行中键入指令 >> profile on关键字on的作用:打开性能分析器,并将前面的统计结果清除§其次,运行需要分析的M文件 >> array_vs_loops§最后,在MATLAB命令行中键入指令 >> profile report此时MATLAB将分析结果创建为一个超文本格式的文档,该文档就是性能分析的总结文档 通过命令行(续)通过命令行(续) 通过命令行(续)通过命令行(续) 通过命令行(续)通过命令行(续)语法说明profile on开启性能分析器,同时清除上一次的统计信息profile off关闭性能分析器profile report关闭性能分析器,同时输出超文本的报告profile plot关闭性能分析器,同时以柱状图绘制统计结果profile resume重新开启性能分析器,保留前一次的统计结果profile clear清除统计结果profile viewer打开图形界面的性能分析器S= profile(‘status’)将性能分析器的状态保存在结构S中S= profile(‘info’)关闭性能分析器,同时将分析结果保存在结构S中profile函数的使用方法 MATLABMATLAB编程基础(续)编程基础(续)4.1 概述4.2 流程控制4.3 脚本文件4.4 函数文件4.5 M文件调试4.6 M文件性能分析4.7 小结 4.7 4.7 小结小结§主要讲述了如何利用MATLAB编程语言——M语言进行编程§流程控制§顺序结构§选择结构§循环结构§脚本文件§函数文件§基本结构§输入输出参数(参数个数确定、参数个数不确定)§子函数和私有函数§局部变量和全局变量§M文件调试和性能分析 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.