设计教室
设计欣赏|图形图像|媒体动画|机械电子|CI设计|设计文献|PhotoShop|Corel3Dmax|Flash|AutoCad|设计视频
首页 > 设计教室 > 机械电子 > MATLAB > 正文

Matlab 变量的检测传递和限权使用函数


8.5 变量的检测传递和限权使用函数
8.5.2 “变长度”输入输出宗量

【 * 例 8.5.2 -1 】变长度宗量使用示例。

(1)编写函数文件 ringzy.m
[ringzy.m]
function varargout = ringzy(r,varargin)
%RINGZY Plot a ring and calculate the area of the ring.
% r 基圆半径
% 调用格式
% [x1,y1,x2,y2,s1,s2]=ringzy(r,r2,'PropertyName','PropertyValue',...)
% ( 1 )无输出时,绘圆或环。
% ( 2 )有输出时,不绘图。
% (x1,y1),(x2,y2) 分别是两个圆的坐标点;
% s1 是基圆面积;
% s2 为正值时,表示内环面积;为负值时,表示外环面积。
vin=length(varargin);Nin=vin+1; %<11>
error(nargchk(1,Nin,nargin)) % 检查输入变量数目是否合适
if nargout>6 % 检查输出变量数目是否合适
error( 'Too many output arguments' )
end

t=0:pi/20:2*pi;x=r*exp(i*t);s=pi*r*r;
if nargout==0
switch Nin
case 1
plot(x, 'b' )
case 2
r2=varargin{1}; %<22>
x2=r2*exp(i*t);
plot(x, 'b' );hold on ;plot(x2, 'b' );hold off
otherwise
r2=varargin{1}; %<26>
x2=r2*exp(i*t);
plot(x,varargin{2:end});hold on % 利用元胞数组设置对象属性 <28>
plot(x2,varargin{2:end});hold off % 利用元胞数组设置对象属性 <29>
end ;

axis( 'square' )
else
varargout{1}=real(x);varargout{2}=imag(x); %<33>
varargout{5}=pi*r*r;varargout{6}=[]; %<34>
if Nin>1
r2=varargin{1}; %<36>
x2=r2*exp(i*t);
varargout{3}=real(x2);varargout{4}=imag(x2); %<38>
varargout{6}=pi*(r^2-r2^2); %<39>
end ;
end

(2)有输出情况 :请读者自己用 plot(x1,y1,x2,y2) 检验下列三个调用示例的运行结果。
r1=1;r2=3;
[x1,y1,x2,y2,s1,s2]=ringzy(r1);
[x1,y1,x2,y2]=ringzy(r1,r2);
[x1,y1,x2,y2,s1,s2]=ringzy(r1,r2);

(3)无输出情况:为节省篇幅,在此给出三个调用示例。
r1=1;r2=0.6;
subplot(1,3,1),ringzy(r1,r2),
subplot(1,3,2),ringzy(r1,r2,'Marker','o')
subplot(1,3,3),ringzy(r1,r2,'LineWidth',5,'Color',[1 0.4 0])


图 8.5.2 -1-1 变长度输入宗量不同调用格式产生的图形


8.5.3 跨空间变量传递
8.5.3.1 跨空间计算串表达式的值

【 * 例 8.5.3 .1-1 】 evalin 运行机理与 eval 的异同。

(1)编写 M 函数文件
[evalinzzy.m]
function y1=evalinzzy(a,s)
t=(0:a)/a*2*pi;
y1=subevalinzzy(4,s);
%------------ subfunction -------------
function y2=subevalinzzy(a,s)
t=(0:a)/a*2*pi;ss= 'a*exp(i*t)' ;
switch s
case { 'base' , 'caller' }
y2=evalin(s,ss);
case 'self'
y2=eval(ss);
end

(2)在 Notebook 或 MATLAB教程: 指令窗中运行以下指令
clear,a=30;t=(0:a)/a*2*pi;sss={'base','caller','self'};
for k=1:3
y0=evalinzzy(8,sss{k});
subplot(1,3,k)
plot(real(y0),imag(y0),'r','LineWidth',3),axis square image
end

上一篇: Matlab 制作个性化双坐标系
下一篇:Matlab 光标形状的自制

评论  点击查看
 
设计频道推荐
设计热点文章