第一章理论模型(1)_第1页
第一章理论模型(1)_第2页
第一章理论模型(1)_第3页
第一章理论模型(1)_第4页
第一章理论模型(1)_第5页
已阅读5页,还剩56页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MATLAB程序设计基础 程序设计 vM文件 两种形式:命令形式(Script) 函数形式(Function) 命令式M文件在运行过程中可以调用MATLAB工作域内所有 的数据,而且,所产生的所有变量均为全局变量,直到用户 执行clear命令清除;函数式文件中所有变量除特殊声明,均 为局部变量。 v命令式M文件 提示: 标点符号要运用恰当; 注意程序的书写风格,保持程序的可读性; 要以m为文件扩展名,在低版本的matlab中,文件名要符合8.3格式。 v函数式M文件 function 返回变量列表=函数名(输入变量列表) 注释说明语句段 函数体 提示: 第一行为function语句; func

2、tion后定义函数名和输入输出参数,函数被调用时按 此格式执行; 文件名必须与函数名一一对应; 函数执行完后,只保留返回结果,不保留中间过程; v例: function f=fibfun(n) %FIBFUN for calculating fibonacci numbers. %Incidengtally, the name fibonacci comes from %Filius Bonassi, or son of Bonassus %fibfun.m if n2 f=fibfun(n-1)+fibfun(n-2); else f=1; end ?help fibfun FIBFUN f

3、or calculating fibonacci numbers. Incidengtally, the name fibonacci comes from Filius Bonassi, or son of Bonassus fibfun.m ?lookfor fib FIBFUN for calculating fibonacci numbers. 注:为了利用MATLAB的关键字搜索功能,应该在M文件的第 一行注释中,尽可能多的包含函数的特征信息。 控制语句 v循环语句 有两种方式:for循环和while循环 for循环 for 循环变量=s1:s3:s2 循环体语句组 end 说明:

4、for 语句一定要有end结束标志; 循环语句中要用“;”防止中间结果的输出; 书写时采用锯齿结构以增加可读性; v例:求 mysum=0; for i=1:1:100 mysum=mysum+i; end; mysum 求取s1的值i i在s1和s2之间? 循环体语句组 i+s3-i 是 否 结束循环 100 1i i v for 循环的一般形式 for v=vect statements end vect为任意给定的向量,则循环变量从向量的第一个数值一 直循环到最后一个数值。 例1(见前例): mysum=0; v=1:100; for i=v;mysum=mysum+i;end mysu

5、m 例2: x=; for i=Hello, x=i x; end, x v while循环 while 逻辑变量 循环体语句组 end 例(见前例): mysum=0;i=1; while (i10000), break; end mysum=mysum+m; end m, mysum if 条件式 条件块语句组1 else 条件块语句组2 end 条件语句组 语句组1语句组2 是 否 例:多项式加例:多项式加 p1=1 5 4; p2=1 6 11 6; n1=length(p1); n2=length(p2); if n1firstlevel num1=num1+1; elseif li

6、st(i)secondlevel num2=num2+1; else num3=num3+1; end end ?global firstlevel secondlevel ?firstlevel=85; ?secondlevel=75; ?a,b,c=test3(90,89,60,79,89,60,99,98,100) a = 1 b = 2 c = 0 子函数与局部函数 v函数文件中题头定义的函数为主函数,在函数体内 定义的其他函数即为子函数。子函数只能为主函数 或同一主函数下其他的子函数所调用。 function c=test(a,b)%main function c=test1(a,b

7、)*test2(a,b); function c=test1(a,b)%sub function c=a+b; function c=test2(a,b)%sub function c=a-b; v放置于目录private下的函数称为局部函数, 这些函数只有private目录的父目录中的函数 才可以调用,其他目录的函数不能调用。局 部函数与一般函数文件的编辑相同。 vMATLAB在调用函数时,首先检测该函数是 否为此文件的子函数;如果不是,再检测是 否为可用的局部函数;如果仍不是,则检测 MATLAB搜索路径中其他的M文件。 程序设计的辅助函数 v执行函数 y1,y2,yn=feval(fun

8、ction,x1,x2,xn) 以函数名为输入变量的函数。 evalin(workspacename,expression) 对指定工作空间workspacename中的变量进 行操作,计算表达式expression的值。 v容错函数 error(错误信息) 触发函数error时,中断程序的运行,显示错误信息。 warning用法类似, 但不会中断程序。 function c=testerror(a,b) flag=0; if ischar(a) else error(Input must be a string!); end if flag c=strcat(a,b); end v时间控制函

9、数 日期表达形式: dd-mmm-yyyy mm/dd/yy mm/dd 12-Oct-2003 10/12/03 10/12 时间表达形式: HH:MM:SS HH:MM:SS PM v cputime的调用: t=cputime; 程序段; t=cputime-t; 显示该程序段运行所占用的CPU时间。 v tic、toc的调用方法 tic; 程序段; toc; 显示运行该程序段所需的时间。 vetime(time2,time1) 计算两时刻的时间差。 程序设计优化 v以矩阵为操作主体 以向量运算代替循环运算,提倡矩阵操作 ?tic;x=1;for i=1:1000,y(i)=sin(x)

10、;x=x+0.1*pi;end,toc elapsed_time = 0.0500 ?tic;x=1:0.1*pi:1000*pi;y=sin(x);toc elapsed_time = 0.0100 v在多重循环的情况下,建议外循环执行循环 次数少的,内循环执行循环次数多的。 例:生成510000的Hilbert矩阵,其中 hi,j=1/(i+j-1) Test2.m tic for j=1:10000 for i=1:5 H(i,j)=1/(i+j-1); end end toc Test1.m tic for i=1:5 for j=1:10000 H(i,j)=1/(i+j-1); e

11、nd end toc ?test1 elapsed_time = 0.2970 ?test2 elapsed_time = 0.6100 v大型矩阵预先定维 大型矩阵动态的定维会降低程序运行效率, 所以,应预先估计变量的最大维数,用zeros 或ones等进行预先定维。 tic H=zeros(5,10000); for i=1:5 for j=1:10000 H(i,j)=1/(i+j-1); end end toc tic H=zeros(5,10000); for i=1:5 H(i,:)=1./i:i+9999; end toc ?test1 elapsed_time = 0.2970

12、 ?test2 elapsed_time = 0.0310 对于二重循环,还可以使用meshgrid函数来 构造。 v优先考虑内在函数 v采用有效算法 v采用Mex技术 ?tic,i,j=meshgrid(1:5,1:10000);H=1./(i+j-1);toc elapsed_time = 0.0150 面向对象的程序设计 v类和对象的构造 类的概念是结构体的拓展,类中可以包含变 量形成员,也可以包含与这些变量相关联的 函数或运算。对象是类的一个实例。 首先定义一个适当的名字; 以这个名字建立一个子目录,目录名为该名称前 加符号; 编写一个引导函数,函数名与类同名。 v例:定义一个多项式类

13、 如果不给出输入变量,则建立一个空多项式; 如果输入变量a为多项式类,则直接把它传送给输出变量 p; 如果a为向量,则将此向量变换成行向量,再构造一个多 项式对象; function p=polynom(a) if nargin=0 p.c=;p=class(p,polynom); elseif isa(a,polynom), p=a; else p.c=a(:).;p=class(p,polynom); end v类的显示 在此目录下重新建立 display()函数。 函数自动按照多项式 显示的格式构造字符 串,并显示出来。 function display(p) disp( );disp(

14、inputname(1), = ) disp( );disp( char(p);disp( ); function s=char(p) if all(p.c=0) s=0; else d=length(p.c)-1;s=; for a=p.c; if a=0 if isempty(s) if a0, s=s,+; else, s=s,-;a=-a; end end if a=1|d=0, s=s, num2str(a); if d0, s=s,*; end end if d=2, s=s,x,int2str(d); elseif d=1, s=s x; end end d=d-1; end e

15、nd v各种运算的建立 加法运算:对plus()函数进行重载定义; 减法运算:对minus()函数进行重载定义; 乘法运算:对mtimes()函数进行重载定义; 乘方运算:对mpower()函数进行重载定义; function p=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); function p=minus(a,b) a=polynom(a); b=polynom(b); k=length(b.c)-length(a.c

16、); p=polynom(zeros(1,k) a.c -zeros(1,-k) b.c); function p=mtimes(a,b) a=polynom(a); b=polynom(b); p=polynom(conv(a.c,b.c); function p=mpower(a,n) if n=0, n=floor(n);a=polynom(a);p=1; if n=1 for i=1:n, p=p*a;end end else error(Power should be a non-negative integer.) end 875 . 135)( 74)( 234 23 xxxxs

17、Q xxsP ?P=polynom(1 4 0 -7) P = x3+4*x2-7 ?Q=polynom(5 3 -1.5 7 8) Q = 5*x4+3*x3-1.5*x2+7*x+8 ?P+Q ans = -5*x4-2*x3+5.5*x2-7*x-15 ?P-Q ans = -5*x4-2*x3+5.5*x2-7*x-15 ?P*Q ans = 5*x7+23*x6+10.5*x5-34*x4+15*x3+42.5*x2-49*x-56 ?P3 ans = x9+12*x8+48*x7+43*x6-168*x5-336*x4+147*x3+588*x2-343 文件格式与读写 vMatl

18、ab的文件 MDL文件simulink生成的模型描述文件; DLL文件由Mex技术生成的matlab可调用函数库; MAT文件matlab格式存储的二进制数据文件 P 文件 M文件变换后的伪代码文件。 v变量存储命令 save 文件名 变量列表 文件名为要存储的文件名,如果不给出文件 名则默认为matlab.mat;变量列表为要存储 的变量,各个变量名间用空格分割,如果不 给出变量名列表,则将整个工作空间中所有 变量都存入该文件。 例: save tmp a b c 将a,b,c三个变量存到tmp.mat文件中,默 认目录为work目录。 save(temp space,a,b,c) 可以使用

19、任意的合法文件名。 v变量装载命令 load 文件名 或 load(文件名) 从mat文件中将变量数据装载入工作空间。 vASCII格式的变量存储 save temp.dat /ascii 此时,文件内容为可读的,当变量的精度被 降低。 v文件操作函数 打开文件 文件句柄=fopen(文件名,打开方式) 如果句柄的值大于0,说明文件打开成功;打开方式: r 只读 w 只写 a 追加 r+ 可读又可写 关闭文件 fclose(文件句柄) 成功,则返回0;否则返回1。 如果想关闭matlab运行中打开的所有文件, 可以用fclose(all)命令。 有格式读文件 A=fscanf(文件句柄,输入格

20、式,变量大小N) 从文件中读取N个元素,赋给A。 有格式写文件 fprintf(文件句柄,输出格式,输出变量表) 输出格式控制变量的输出形式,每个描述格 式的字符串以引导,如s表示字符格式, d表示整型数格式,23.13g表示双精度浮 点格式; 输出变量表中,变量名之间用逗号隔开。 读入整个一行 str=fgetl(文件句柄) 或 str=fgets(文件句柄) 从文件中读入一整行信息,前者舍弃字符串末尾的 回车符号,后者不舍弃。 字符串读写 类似于文件读写,把文件句柄替换为字符串变量。 sscanf(字符串变量,输入格式,变量大小) 字符串变量=sprintf(输出格式,输出变量列表) 例:

21、 文本文件显示。 function fileprint(fname) if nargin=1 f_id=eval(fopen( fname,.m,r); else fname,fpath=uigetfile(*.m,Please enter a file name); f_id=fopen(fpath,fname,r); end i=0; while feof(f_id)=0 strText=fgetl(f_id); i=i+1; disp(sprintf(%4d:%s,i,strText); end fclose(f_id); ?fileprint(fileprint) 1:function

22、 fileprint(fname) 2:if nargin=1 3: f_id=eval(fopen( fname,.m,r); 4:else 5: fname,fpath=uigetfile(*.m,Please enter a file name); 6: f_id=fopen(fpath,fname,r); 7:end 8:i=0; 9:while feof(f_id)=0 10: strText=fgetl(f_id); 11: i=i+1; 12: disp(sprintf(%4d:%s,i,strText); 13:end 14:fclose(f_id); 程序调试 v语法错误 发

23、生在程序代码的解释 过程中,一般有函数参 数输入类型有误或矩阵 运算阶数不符等情况。 v执行错误 发生在程序运行过程中, 出现溢出或死循环等引 起,错误与程序有关, 较难发现。 ?a=1 2 ;3 4; ?b=1 2 3;4 5 6;7 8 9; ?a*b ? Error using = * Inner matrix dimensions must agree. ?a =NaN ?isnan(a) ans = 1 ?a=; ?isempty(a) ans = 1 尽量避免出现NaN、inf 或空矩阵等异常数据,要 适当采取方法来控制。 v错误检测 语法错误会给出相应的信息,容易检查定位; 将程序执行的中间结果输出到命令窗口,以方 便检查; 使用keyboard函数中断程序,进入调试状态, 实现交互式调试; 将函数头注释掉,从而函数变为脚本文件调试; 使用调试菜单或调试函数。 v调试函数 dbstop in at 用来在M文件中 设置断点; 函数dbstatus用来显示断点信息; 函数dbtype显示M文件文本(包括行号); 函数dbstep从断点处继续执行M文件; 函数dbstack显示M文件执行时调用的堆栈等; 函数dbup/dbdown可以实现工作空间的切换

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论