第四章 MATLAB程序设计基础 matlab的工作方式:交互式;M文件方式。 M文件的作用:在command window中输入已编辑保存的M文件名或函数,则自动搜索该文件,找到则按规定的计算任务以解释的方式逐一执行语句。 2019/4/26 电子教研室 qmw_qyq@163.com
4.1 M文件的创建 创建M文件 2019/4/26 电子教研室 qmw_qyq@163.com
4.2非函数文件(脚本文件) 一般来说,命令文件用于把很多需要在命令窗口输入的命令放在一起,以便于修改; 由于命令文件没有输入和输出参数,只是一些命令行的组合,所以命令文件比函数文件更简单。命令文件可对工作空间中的变量进行操作,也可生成新的变量。即使命令文件运行结束,其运行过程中所产生的变量仍保留在工作空间中,直到关闭matlab或用相关删除命令。 例: x=0:pi/100:2*pi; y1=cos(x); y2=sin(x); plot(y1,y2); end 2019/4/26 电子教研室 qmw_qyq@163.com
4.3函数文件 一、函数文件的格式 函数文件一般用于把许多重复的程序段封装起来,使程序更加简洁。 例: function y=mymean(x); %该程序用于计算矢量中元素的平均值 %x为输入参数,代表输入的矢量 %y为输出参数,代表矢量中元素的平均值 %如果输入不是向量,则返回错误信息 [m,n]=size(x); %判断输入是否为矢量 if(~((m==1)|(n==1)|(m==1&n==1))) %如果输入不是矢量,显示出错信息 error('输入x必须是向量'); end y=sum(x)/length(x); 2019/4/26 电子教研室 qmw_qyq@163.com
1、函数定义 function y=ymean(x) function [y1,y2,…]=FN(x1,x2,…) 2、帮助文本 3、函数体 4、注释 二、函数文件参数个数的检查 nargin nargout确定函数被调用时,输入、输出参数的个数,函数体中可以根据输入参数个数的不同而执行不同的操作。Nargchk用于检查输入函数个数是否正确 2019/4/26 电子教研室 qmw_qyq@163.com
例: function c=testarg(a,b) if(nargin= =1) c=a.^2; elseif(nargin= =2) c=a+b; end 注意:可以用任何编辑器编写m文件 当编写函数文件时,其文件名必须与函数名一致 2019/4/26 电子教研室 qmw_qyq@163.com
例:用命令文件和函数文件完成相同的任务:求所有小于2000且为2的整数次幂的正整数。 A:用命令文件的方式 %求小于2000且为2的整数次幂的正整数 f(1)=2; k=1; while f(k)<1000 f(k+1)=f(k)*2; k=k+1; end f,k 2019/4/26 电子教研室 qmw_qyq@163.com
%求小于任何正整数且为2的整数次幂的正整数 %c=tt(n),n可取任意正整数 f(1)=2; k=1; while f(k)<n/2 B、用函数文件的方式实现 function f=tt(n) %求小于任何正整数且为2的整数次幂的正整数 %c=tt(n),n可取任意正整数 f(1)=2; k=1; while f(k)<n/2 f(k+1)=f(k)*2; k=k+1; end f 2019/4/26 电子教研室 qmw_qyq@163.com
4.4、全局变量和局部变量 一、什么是全局与局部变量? 二、全局变量的定义 global BEG END Example:function s=mean1 global k=BEG:END; s=sum(k) 调用如下: global BEG END; BEG=1;END=10; S1=mean1; 2019/4/26 电子教研室 qmw_qyq@163.com
funciton all=weight_add(x,y) %add two variable with different weight. 例: funciton all=weight_add(x,y) %add two variable with different weight. global alpha beta all=alpha*x+beta*y; 在命令窗口内键入: alpha=1 beta=2 all=weight_add(1,1); 2019/4/26 电子教研室 qmw_qyq@163.com
4.5程序控制流程语句 一、循环控制 1、for循环 调用格式: for t=表达式1:表达式2:表达式3 循环体 end 注意:1)步长可正可负 2)内部允许嵌套,for与end必须配对 3)在循环体内改变t值不影响循环次数,但对表达式有影响 4)若表达式为矩阵则循环列次 2019/4/26 电子教研室 qmw_qyq@163.com
例1:for n=1:5 例2 s=0; for m=1:n for i=1:2:99 r(n,m)=m*n; s=s+i; end end 例3 i=1:3 例4 for I=1:3 例5 a=[1 3 5;2 6 8]] x(I)=I I=2 for I=a I=2 x(I)=I x(I)=a end end end 2019/4/26 电子教研室 qmw_qyq@163.com
2)当表达式计算对象为矩阵时,矩阵的所有值均为真时才执行 2、while循环语句 调用格式 while 表达式 语句体 end 注意:1)while必须与end成对 2)当表达式计算对象为矩阵时,矩阵的所有值均为真时才执行 3)循环量在循环体中增减 2019/4/26 电子教研室 qmw_qyq@163.com
例1:求级数和 s=1+1/2+1/3+…..+1/100 s=0 n=1; while n<=100 s=s+1/n; n=n+1; end 例2:找阶乘超过10100的最小数 n=2; while prod(1:n)<1.e100 2019/4/26 电子教研室 qmw_qyq@163.com
二、条件控制语句 1、if条件语句 matlab中,if条件语句的功能是:如果满足某个条件则执行一条或一组语句,否则就不执行其内部的语句,或者执行else后面的语句。调用格式如下: if condition 或: if condition1 statement statement1 end elseif conditon2 或:if condition statement2 statement1 …………………… else statement2 end end 2019/4/26 电子教研室 qmw_qyq@163.com
注意:1)必须与END配对 2)具有优先顺序性 3)else elseif不是必须的 4)若表达式为矩阵,则每个元素为真才执行 例: if n<0 a=100; else if n=3 a=n; else a=0; end 2019/4/26 电子教研室 qmw_qyq@163.com
一旦num为其中的某个值或字符串时,就执行所对应的指令,没有对应时,则执行otherwise后的语句。 2、SWITCH-CASE 一旦num为其中的某个值或字符串时,就执行所对应的指令,没有对应时,则执行otherwise后的语句。 一般switch-case语句格式为: switch 控制变量(标量或字符串) case n1 command1 case n2 command2 . .otherwise 注意:与END配对 commandn 并行 end 2019/4/26 电子教研室 qmw_qyq@163.com
case –1 disp(‘I love you’); case 0 disp(‘I don’t like you’) 例: Switch input_num case –1 disp(‘I love you’); case 0 disp(‘I don’t like you’) case 1 disp(‘I hate you’) case 2 disp(‘my god’) otherwise disp(‘I don’t know you’) end 2019/4/26 电子教研室 qmw_qyq@163.com
例: Switch k case 1 set(gcf,’color’,’r’); case 2 set(gcf,’color’,’w’); set(gcf,’color’,’y’); otherwise set(gcf,’color’,’g’); end 2019/4/26 电子教研室 qmw_qyq@163.com
if (1+eps)<=1 eps=eps*2 三、转移语句 转移语句用来控制程序流向,在必要时中断循环体或函数的执行并进而执行下面的语句。Matlab提供了两种转移语句:break语句和return语句。 Break语句:一般出现在循环语句中,它表示跳出循环体,即结束循环(它只能退出包含它的最内层循环): 例: eps=1; for num=1:100 eps=eps/2; if (1+eps)<=1 eps=eps*2 break 2019/4/26 电子教研室 qmw_qyq@163.com
return语句:用于中断函数的执行,并返回调用它的上级函数。 end num return语句:用于中断函数的执行,并返回调用它的上级函数。 例: function y=test(x) if(x<0) y=0 return y=1 2019/4/26 电子教研室 qmw_qyq@163.com
4.6 子函数 函数中再定义函数,函数文件中第一行定义的函数为主函数,调用函数名时,调用主函数。 第一行外,其余定义的为子函数。子函数只能被本函数调用。 function [avg,med]=main_function(u) %main n=length(u); avg=mean(u,n); med=median(u,n); 2019/4/26 电子教研室 qmw_qyq@163.com
function a=subf1(v,n) %sub1 a=sum(v)/n; function m=subf2(v,n) %sub2 w=sort(v); if rem(n,2)==1 m=w((n+1)/2); else m=(w(n/2)+w(n/2+1))/2; end 2019/4/26 电子教研室 qmw_qyq@163.com
4.7交互式程序设计 一、常用命令 1、echo:显示命令 2、input:执行过程中输入一行信息 Example: n=input(‘please input n=’) 2^n (1)input(string) (2)input(string,’s’) 将字符串string显示出来,等待用户输入一个字符,并将这个字符串作为函数的返回值,也可在调用的同时将返回值赋给一个变量。 2019/4/26 电子教研室 qmw_qyq@163.com
a=input(‘please input a number:’); for j=1:a x(j)=j*j; end x 例: 编写ask.m文件 a=input(‘please input a number:’); for j=1:a x(j)=j*j; end x y=input(‘please input a string:’,’s’); y 2019/4/26 电子教研室 qmw_qyq@163.com
pause是matlab提供的暂停语句,其功能是在程序执行过程中实现暂停,增加程序的交互性。其使用方法如下: pause(n) 暂停n秒 pause off 这个语句后所有暂停语句无效 pause on 这个语句后暂停语句有效 2019/4/26 电子教研室 qmw_qyq@163.com
启动键盘管理程序,等待输入多行命令,并将键盘输入作为底稿文件处理。 4、keyboard 启动键盘管理程序,等待输入多行命令,并将键盘输入作为底稿文件处理。 例: function y=user(x) keyboard 调用:user k>> k>>x=0:0.01:1; k>>plot(x,user(x)) k>>y=x.^3; k>>return 2019/4/26 电子教研室 qmw_qyq@163.com
二、生成选择菜单 menu函数可生成一个选择式的菜单,使用户能够选择输入。其调用格式为:k=menu(‘menuname’,s1,s2……si),其中k返回调用值,si为字符串(菜单项,最多为32项)。 例:while 1 k=menu('choose a color','red','blue','close'); if k==1 x='red' elseif k==2 x='blue' elseif k==3 break end 2019/4/26 电子教研室 qmw_qyq@163.com
三、建立按钮式演示菜单 Choices函数可以创建一个窗口,由其控制界面及其所对应的功能生成一个演示菜单,调用方法如下: choices(name,header,buttonlabels,callbacks) 例:header = 'Easy Example'; labels = str2mat('Choice 1','Choice 2','Choice 3'); callbacks = str2mat('image(magic(1))','image(magic(2))', ... 'image(magic(3))'); choices('EXAMPLE', header, labels, callbacks); 2019/4/26 电子教研室 qmw_qyq@163.com
4.8错误和警告信息 1、函数err和fprintf 显示出错信息,终止程序的执行 2、warning 用法同上 if(~((m==1)|(n==1)|(m==1&n==1))) %如果输入不是矢量,显示出错信息 error('输入x必须是向量'); end 2、warning 用法同上 2019/4/26 电子教研室 qmw_qyq@163.com
4.9程序优化 1、循环向量化 例如:I=0; n=0:0.01:9.99; for n=0:0.01:9.99 y=cos(n) I=I+1; y(I)=cos(n); end 2019/4/26 电子教研室 qmw_qyq@163.com
clear pack quit/exit save load 2、数组预定维 zeros(m,n) cell struct 3、内存管理 clear pack quit/exit save load 2019/4/26 电子教研室 qmw_qyq@163.com