变量的检测传递和限权使用函数
1 “变长度”输入输出宗量<BR><BR>【 * 例 1 】变长度宗量使用示例。<BR><BR>(1)编写函数文件 ringzy.m<BR><STRONG><BR></STRONG>function varargout = ringzy(r,varargin)<BR>%RINGZY Plot a ring and calculate the area of the ring.<BR>% r 基圆半径<BR>% 调用格式<BR>% =ringzy(r,r2,PropertyName,PropertyValue,...)<BR>% ( 1 )无输出时,绘圆或环。<BR>% ( 2 )有输出时,不绘图。<BR>% (x1,y1),(x2,y2) 分别是两个圆的坐标点;<BR>% s1 是基圆面积;<BR>% s2 为正值时,表示内环面积;为负值时,表示外环面积。<BR>vin=length(varargin);Nin=vin+1; %<11><BR>error(nargchk(1,Nin,nargin)) % 检查输入变量数目是否合适<BR>if nargout>6 % 检查输出变量数目是否合适<BR>error( Too many output arguments )<BR>end<BR><BR>t=0:pi/20:2*pi;x=r*exp(i*t);s=pi*r*r;<BR>if nargout==0<BR>switch Nin<BR>case 1<BR>plot(x, b )<BR>case 2<BR>r2=varargin{1}; %<22><BR>x2=r2*exp(i*t);<BR>plot(x, b );hold on ;plot(x2, b );hold off<BR>otherwise<BR>r2=varargin{1}; %<26><BR>x2=r2*exp(i*t);<BR>plot(x,varargin{2:end});hold on % 利用元胞数组设置对象属性 <28><BR>plot(x2,varargin{2:end});hold off % 利用元胞数组设置对象属性 <29><BR>end ;<BR><BR>axis( square )<BR>else<BR>varargout{1}=real(x);varargout{2}=imag(x); %<33><BR>varargout{5}=pi*r*r;varargout{6}=[]; %<34><BR>if Nin>1<BR>r2=varargin{1}; %<36><BR>x2=r2*exp(i*t);<BR>varargout{3}=real(x2);varargout{4}=imag(x2); %<38><BR>varargout{6}=pi*(r^2-r2^2); %<39><BR>end ;<BR>end<BR><BR>(2)有输出情况 :请读者自己用 plot(x1,y1,x2,y2) 检验下列三个调用示例的运行结果。<BR>r1=1;r2=3;<BR>=ringzy(r1);<BR>=ringzy(r1,r2);<BR>=ringzy(r1,r2);<BR><BR>(3)无输出情况:为节省篇幅,在此给出三个调用示例。<BR><A>r1=1;r2=0.6; <BR></A>subplot(1,3,1),ringzy(r1,r2),<BR>subplot(1,3,2),ringzy(r1,r2,Marker,o)<BR>subplot(1,3,3),ringzy(r1,r2,LineWidth,5,Color,)<P align=center><A><IMG src="http://www.ddvip.net/machine/matlab/index1/img_matlab/55/55_clip_image002.gif"><BR></A>图 8.5.2 -1-1 变长度输入宗量不同调用格式产生的图形 </P> 2 跨空间变量传递<BR>a 跨空间计算串表达式的值<BR><BR>【 * 例 2 】 evalin 运行机理与 eval 的异同。<BR><BR>(1)编写 M 函数文件<BR><STRONG><BR></STRONG>function y1=evalinzzy(a,s)<BR>t=(0:a)/a*2*pi;<BR>y1=subevalinzzy(4,s);<BR>%------------ subfunction -------------<BR>function y2=subevalinzzy(a,s)<BR>t=(0:a)/a*2*pi;ss= a*exp(i*t) ;<BR>switch s<BR>case { base , caller }<BR>y2=evalin(s,ss);<BR>case self<BR>y2=eval(ss);<BR>end<BR><BR>(2)在 Notebook 或 MATLAB 指令窗中运行以下指令<BR><A>clear,a=30;t=(0:a)/a*2*pi;sss={base,caller,self}; <BR></A>for k=1:3<BR>y0=evalinzzy(8,sss{k});<BR>subplot(1,3,k)<BR>plot(real(y0),imag(y0),r,LineWidth,3),axis square image<BR>end <STRONG></STRONG>
<P align=center><A><IMG src="http://www.ddvip.net/machine/matlab/index1/img_matlab/55/55_clip_image002_0000.gif"><BR></A>图 2 利用不同工作空间中的变量值计算 eval(a*exp(i*t)) </P>
<P><BR>b 跨空间赋值<BR><BR>【 * 例 3 】 assignin 运作机理示范。<BR><BR>(1)编写 M 函数文件<BR><BR>function y=assigninxyq(x)<BR>y=sqrt(x);t=x^2;<BR>assignin( base , yy ,t)<STRONG> <BR><BR></STRONG>(2)在 Notebbok 或 MATLAB 指令窗中运行以下指令<BR><A>clear;x=4;y=assigninxyq(x); <BR></A>disp(),disp()<BR><A>x y yy<BR></A>4 2 16</P>
页:
[1]