matlab程序设计基础程序设计.ppt

上传人:sh****n 文档编号:6379427 上传时间:2020-02-24 格式:PPT 页数:61 大小:397KB
返回 下载 相关 举报
matlab程序设计基础程序设计.ppt_第1页
第1页 / 共61页
matlab程序设计基础程序设计.ppt_第2页
第2页 / 共61页
matlab程序设计基础程序设计.ppt_第3页
第3页 / 共61页
点击查看更多>>
资源描述
MATLAB程序设计基础 程序设计 M文件两种形式 命令形式 Script 函数形式 Function 命令式M文件在运行过程中可以调用MATLAB工作域内所有的数据 而且 所产生的所有变量均为全局变量 直到用户执行clear命令清除 函数式文件中所有变量除特殊声明 均为局部变量 命令式M文件提示 标点符号要运用恰当 注意程序的书写风格 保持程序的可读性 要以m为文件扩展名 在低版本的matlab中 文件名要符合8 3格式 函数式M文件function 返回变量列表 函数名 输入变量列表 注释说明语句段函数体提示 第一行为function语句 function后定义函数名和输入输出参数 函数被调用时按此格式执行 文件名必须与函数名一一对应 函数执行完后 只保留返回结果 不保留中间过程 例 functionf fibfun n FIBFUNforcalculatingfibonaccinumbers Incidengtally thenamefibonaccicomesfrom FiliusBonassi or sonofBonassus fibfun mifn 2f fibfun n 1 fibfun n 2 elsef 1 end helpfibfunFIBFUNforcalculatingfibonaccinumbers Incidengtally thenamefibonaccicomesfromFiliusBonassi or sonofBonassus fibfun m lookforfibFIBFUNforcalculatingfibonaccinumbers 注 为了利用MATLAB的关键字搜索功能 应该在M文件的第一行注释中 尽可能多的包含函数的特征信息 控制语句 循环语句有两种方式 for循环和while循环for循环for循环变量 s1 s3 s2循环体语句组end说明 for语句一定要有end结束标志 循环语句中要用 防止中间结果的输出 书写时采用锯齿结构以增加可读性 例 求mysum 0 fori 1 1 100mysum mysum i end mysum 求取s1的值 i i在s1和s2之间 循环体语句组 i s3 i 是 否 结束循环 for循环的一般形式forv vectstatementsendvect为任意给定的向量 则循环变量从向量的第一个数值一直循环到最后一个数值 例1 见前例 mysum 0 v 1 100 fori v mysum mysum i endmysum 例2 x fori Hello x ix end x while循环while逻辑变量循环体语句组end例 见前例 mysum 0 i 1 while i 100 mysum mysum i i i 1 endmysum 条件为真 循环体语句 是 否 结束循环 条件转移结构if逻辑变量条件语句组end例 mysum 0 form 1 1000if mysum 10000 break endmysum mysum m end m mysum if条件式条件块语句组1else条件块语句组2end 条件语句组 语句组1 语句组2 是 否 例 多项式加p1 154 p2 16116 n1 length p1 n2 length p2 ifn1 n2 p1 zeros 1 n2 n1 p1 elsep2 zeros 1 n1 n2 p2 endpsum p1 p2psum 171610 if条件式1条件块语句组1elseif条件式2条件块语句组2 else条件块语句组n 1end 条件1 语句组1 条件2 是 语句组2 是 否 条件n 语句组n 语句组n 1 否 否 是 分支语句switch开关表达式case表达式1语句段1case 表达式2 表达式3 表达式m 语句段2 otherwise语句段nend 注意 无需像C语言那样在下一个case语句前加break语句 当需要在开关表达式满足若干个表达式之一时 用单元结构来表示 otherwise等价于C语言的default语句 程序的执行结果与case语句的次序无关 试探式语句try语句段1catch语句段2end首先试探性的执行语句段1 如果在执行过程中出现错误 则将错误信息赋给lasterr变量 并放弃该段语句 转而执行语句段2中的语句 functionc testtry a b tryc a b catchc strcat a b end 人机交互语句 echo语句echoon打开命令式文件的回应命令 echooff关闭回应命令 echofileon使file文件的命令在执行中被显示 echofileoff关闭file文件的命令执行中的回应 echoonall显示所有执行文件的执行过程 echooffall关闭所有执行文件的回应显示 用户输入提示命令input用来提示用户从键盘输入数据 字符串或表达式 并接收输入值 r input Howmanyapples Howmanyapples 2r 2 r input What syourname s What syourname Gundamr Gundam yesinput智能输入命令answer yesinput question default possib question为屏幕提示问题 default为默认值 possib为检验范围 keyboard暂停执行程序并等待键盘输入状态 处理完毕后 键入return并回车 程序将继续运行 通常用来对程序调试及在程序中修改变量 pausepause暂停程序 等待回应 pause n 等待n秒后继续执行 pauseon显示并执行pause命令 pauseoff显示但不执行pause命令 中断命令break用在循环语句或条件语句中 使得不必等待循环的自然结束 例 鸡兔同笼 头有36 脚共100 求鸡兔各多少 i 1 whileiifrem 100 i 2 4 0endchicken irabit 100 2 i 4 函数变量 nargin函数输入变量的个数例 编制函数test1实现如下功能 如果只提供一个输入变量 则求该输入变量的模 如果有两个输入变量则求它们的和 functionc test1 a b if nargin 1 c det a elseif nargin 2 c a b end varargin可以实现不定数目的输入变量的函数 函数的一切输入变量均存储在单元数组varargin中 与之相对应 输出变量也有相应的函数 如 nargout varargout等 变量作用域 函数内部定义的变量均为局部变量 如果需要使用全局变量 则应当使用命令global定义 并且在任何使用该全局变量的函数中都应加以定义 定义全局变量时 变量之间必须用空格分隔 不能以逗号分隔 function num1 num2 num3 test3 varargin globalfirstlevelsecondlevelnum1 0 num2 0 num3 0 list zeros nargin fori 1 narginlist i sum varargin i list i list i length varargin i iflist i firstlevelnum1 num1 1 elseiflist i secondlevelnum2 num2 1 elsenum3 num3 1 endend globalfirstlevelsecondlevel firstlevel 85 secondlevel 75 a b c test3 90 89 60 79 89 60 99 98 100 a 1b 2c 0 子函数与局部函数 函数文件中题头定义的函数为主函数 在函数体内定义的其他函数即为子函数 子函数只能为主函数或同一主函数下其他的子函数所调用 functionc test a b mainfunctionc test1 a b test2 a b functionc test1 a b subfunctionc a b functionc test2 a b subfunctionc a b 放置于目录private下的函数称为局部函数 这些函数只有private目录的父目录中的函数才可以调用 其他目录的函数不能调用 局部函数与一般函数文件的编辑相同 MATLAB在调用函数时 首先检测该函数是否为此文件的子函数 如果不是 再检测是否为可用的局部函数 如果仍不是 则检测MATLAB搜索路径中其他的M文件 程序设计的辅助函数 执行函数 y1 y2 yn feval function x1 x2 xn 以函数名为输入变量的函数 evalin workspacename expression 对指定工作空间workspacename中的变量进行操作 计算表达式expression的值 容错函数error 错误信息 触发函数error时 中断程序的运行 显示错误信息 warning用法类似 但不会中断程序 functionc testerror a b flag 0 ifischar a end 时间控制函数日期表达形式 dd mmm yyyymm dd yymm dd12 Oct 200310 12 0310 12时间表达形式 HH MM SSHH MM SSPM cputime的调用 t cputime 程序段 t cputime t 显示该程序段运行所占用的CPU时间 tic toc的调用方法tic 程序段 toc 显示运行该程序段所需的时间 etime time2 time1 计算两时刻的时间差 程序设计优化 以矩阵为操作主体以向量运算代替循环运算 提倡矩阵操作 tic x 1 fori 1 1000 y i sin x x x 0 1 pi end tocelapsed time 0 0500 tic x 1 0 1 pi 1000 pi y sin x tocelapsed time 0 0100 在多重循环的情况下 建议外循环执行循环次数少的 内循环执行循环次数多的 例 生成5 10000的Hilbert矩阵 其中hi j 1 i j 1 Test2 mticforj 1 10000fori 1 5H i j 1 i j 1 endendtoc Test1 mticfori 1 5forj 1 10000H i j 1 i j 1 endendtoc test1elapsed time 0 2970 test2elapsed time 0 6100 大型矩阵预先定维大型矩阵动态的定维会降低程序运行效率 所以 应预先估计变量的最大维数 用zeros或ones等进行预先定维 ticH zeros 5 10000 fori 1 5forj 1 10000H i j 1 i j 1 endendtoc ticH zeros 5 10000 fori 1 5H i 1 i i 9999 endtoc test1elapsed time 0 2970 test2elapsed time 0 0310 对于二重循环 还可以使用meshgrid函数来构造 优先考虑内在函数采用有效算法采用Mex技术 tic i j meshgrid 1 5 1 10000 H 1 i j 1 tocelapsed time 0 0150 面向对象的程序设计 类和对象的构造类的概念是结构体的拓展 类中可以包含变量形成员 也可以包含与这些变量相关联的函数或运算 对象是类的一个实例 首先定义一个适当的名字 以这个名字建立一个子目录 目录名为该名称前加 符号 编写一个引导函数 函数名与类同名 例 定义一个多项式类如果不给出输入变量 则建立一个空多项式 如果输入变量a为多项式类 则直接把它传送给输出变量p 如果a为向量 则将此向量变换成行向量 再构造一个多项式对象 functionp polynom a ifnargin 0p c p class p polynom elseifisa a polynom p a elsep c a p class p polynom end 类的显示在此目录下重新建立display 函数 函数自动按照多项式显示的格式构造字符串 并显示出来 functiondisplay p disp disp inputname 1 disp disp char p disp functions char p ifall p c 0 s 0 elsed length p c 1 s fora p c ifa 0if isempty s ifa 0 s s else s s a a endendifa 1 d 0 s s num2str a ifd 0 s s endendifd 2 s s x int2str d elseifd 1 s s x endendd d 1 endend 各种运算的建立加法运算 对plus 函数进行重载定义 减法运算 对minus 函数进行重载定义 乘法运算 对mtimes 函数进行重载定义 乘方运算 对mpower 函数进行重载定义 functionp minus a b a polynom a b polynom b k length b c length a c p polynom zeros 1 k a c zeros 1 k b c functionp minus a b a polynom a b polynom b k length b c length a c p polynom zeros 1 k a c zeros 1 k b c functionp mtimes a b a polynom a b polynom b p polynom conv a c b c functionp mpower a n ifn 0 n floor n a polynom a p 1 ifn 1fori 1 n p p a endendelseerror Powershouldbeanon negativeinteger end P polynom 140 7 P x 3 4 x 2 7 Q polynom 53 1 578 Q 5 x 4 3 x 3 1 5 x 2 7 x 8 P Qans 5 x 4 2 x 3 5 5 x 2 7 x 15 P Qans 5 x 4 2 x 3 5 5 x 2 7 x 15 P Qans 5 x 7 23 x 6 10 5 x 5 34 x 4 15 x 3 42 5 x 2 49 x 56 P 3ans x 9 12 x 8 48 x 7 43 x 6 168 x 5 336 x 4 147 x 3 588 x 2 343 文件格式与读写 Matlab的文件MDL文件 simulink生成的模型描述文件 DLL文件 由Mex技术生成的matlab可调用函数库 MAT文件 matlab格式存储的二进制数据文件P文件 M文件变换后的伪代码文件 变量存储命令save文件名变量列表文件名为要存储的文件名 如果不给出文件名则默认为matlab mat 变量列表为要存储的变量 各个变量名间用空格分割 如果不给出变量名列表 则将整个工作空间中所有变量都存入该文件 例 savetmpabc将a b c三个变量存到tmp mat文件中 默认目录为work目录 save tempspace a b c 可以使用任意的合法文件名 变量装载命令load文件名或load 文件名 从mat文件中将变量数据装载入工作空间 ASCII格式的变量存储savetemp dat ascii此时 文件内容为可读的 当变量的精度被降低 文件操作函数打开文件文件句柄 fopen 文件名 打开方式 如果句柄的值大于0 说明文件打开成功 打开方式 r 只读w 只写a 追加r 可读又可写 关闭文件fclose 文件句柄 成功 则返回0 否则返回 1 如果想关闭matlab运行中打开的所有文件 可以用fclose all 命令 有格式读文件A fscanf 文件句柄 输入格式 变量大小N 从文件中读取N个元素 赋给A 有格式写文件fprintf 文件句柄 输出格式 输出变量表 输出格式控制变量的输出形式 每个描述格式的字符串以 引导 如 s表示字符格式 d表示整型数格式 23 13g表示双精度浮点格式 输出变量表中 变量名之间用逗号隔开 读入整个一行str fgetl 文件句柄 或str fgets 文件句柄 从文件中读入一整行信息 前者舍弃字符串末尾的回车符号 后者不舍弃 字符串读写类似于文件读写 把文件句柄替换为字符串变量 sscanf 字符串变量 输入格式 变量大小 字符串变量 sprintf 输出格式 输出变量列表 例 文本文件显示 functionfileprint fname ifnargin 1f id eval fopen fname m r else fname fpath uigetfile m Pleaseenterafilename f id fopen fpath fname r endi 0 whilefeof f id 0strText fgetl f id i i 1 disp sprintf 4d s i strText endfclose f id fileprint fileprint 1 functionfileprint fname 2 ifnargin 13 f id eval fopen fname m r 4 else5 fname fpath uigetfile m Pleaseenterafilename 6 f id fopen fpath fname r 7 end8 i 0 9 whilefeof f id 010 strText fgetl f id 11 i i 1 12 disp sprintf 4d s i strText 13 end14 fclose f id 程序调试 语法错误发生在程序代码的解释过程中 一般有函数参数输入类型有误或矩阵运算阶数不符等情况 执行错误发生在程序运行过程中 出现溢出或死循环等引起 错误与程序有关 较难发现 a 12 34 b 123 456 789 a b Errorusing Innermatrixdimensionsmustagree a NaN isnan a ans 1 a isempty a ans 1 尽量避免出现NaN inf或空矩阵等异常数据 要适当采取方法来控制 错误检测语法错误会给出相应的信息 容易检查定位 将程序执行的中间结果输出到命令窗口 以方便检查 使用keyboard函数中断程序 进入调试状态 实现交互式调试 将函数头注释掉 从而函数变为脚本文件调试 使用调试菜单或调试函数 调试函数dbstopinat用来在M文件中设置断点 函数dbstatus用来显示断点信息 函数dbtype显示M文件文本 包括行号 函数dbstep从断点处继续执行M文件 函数dbstack显示M文件执行时调用的堆栈等 函数dbup dbdown可以实现工作空间的切换 dbtypedb test1functionC db test A B 2 num11 num12 size A 3 num21 num22 size B 4if num12 num21 5C A B6else7if num11 num22 8C B A 9else10error inputerror 11end12end13return 例 functionC db test A B num11 num12 size A num21 num22 size B if num12 num21 C A Belseif num11 num22 C B A elseerror inputerror endendreturn dbstopindb testat5 a 12 34 b 123 456 db test a b K dbstatusBreakpointfore MATLABR11 work db testisonline5 K dbstack Ine MATLABR11 work db test matline5K whosNameSizeBytesClassA2x232doublearrayB2x348doublearraynum111x18doublearraynum121x18doublearraynum211x18doublearraynum221x18doublearrayGrandtotalis14elementsusing112bytes K dbupInbaseworkspace K dbquit
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!