声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5374|回复: 10

[共享资源] [转帖]M文件编写的一些经典实用实例

[复制链接]
发表于 2005-9-5 23:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
“变长度”输入输出宗量(参数数量可变的)

最近在看张志涌的matlab6.5, 书写得很好,有很多东西值得分享,这是一个边写输入参数和输出结果都是变化的实例, 大家不妨仔细看看,相信对大家有帮助..


【例7.5.2-1】变长度宗量使用示例。
(1) 主程序
[exm07052_1.m]

  1. function varargout = exm07052_1(r,varargin)
  2. %RINGZY Plot a ring and calculate the area of the ring.
  3. %
  4. %
  5. vin=length(varargin);Nin=vin+1; % <11>
  6. error(nargchk(1,Nin,nargin)) %
  7. if nargout>6 %
  8. error('Too many output arguments')
  9. end
  10. t=0:pi/20:2*pi;x=r*exp(i*t);s=pi*r*r;
  11. if nargout==0
  12. switch Nin
  13. case 1
  14. plot(x,'b')
  15. case 2
  16. r2=varargin{1}; %<22>
  17. x2=r2*exp(i*t);
  18. plot(x,'b');hold on ;plot(x2,'b');hold off
  19. otherwise
  20. r2=varargin{1}; %<26>
  21. x2=r2*exp(i*t);
  22. plot(x,varargin{2:end});hold on % <28>
  23. plot(x2,varargin{2:end});hold off % <29>
  24. end;
  25. axis('square')
  26. else
  27. varargout{1}=real(x);varargout{2}=imag(x); %<33>
  28. varargout{5}=pi*r*r;varargout{6}=[]; %<34>
  29. if Nin>1
  30. r2=varargin{1}; %<36>
  31. x2=r2*exp(i*t);
  32. varargout{3}=real(x2);varargout{4}=imag(x2); %<38>
  33. varargout{6}=pi*(r^2-r2^2); %<39>
  34. end;
  35. end
复制代码


(2)调用格式1
  1. r1=1;r2=3;
  2. [x1,y1,x2,y2,s1,s2]=exm07052_1(r1);
  3. [x1,y1,x2,y2]=exm07052_1(r1,r2);
  4. [x1,y1,x2,y2,s1,s2]=exm07052_1(r1,r2);
复制代码


(3)调用格式2
  1. r1=1;r2=0.6;
  2. subplot(1,3,1),exm07052_1(r1,r2),
  3. subplot(1,3,2),exm07052_1(r1,r2,'Marker','o')
  4. subplot(1,3,3),exm07052_1(r1,r2,'LineWidth',5,'Color',[1 0.4 0])
复制代码

[ 本帖最后由 yejet 于 2006-11-11 16:01 编辑 ]

评分

1

查看全部评分

回复
分享到:

使用道具 举报

 楼主| 发表于 2005-9-5 23:18 | 显示全部楼层

回复:(ik760218)[转帖]M文件编写的一些经典实用实例...

主要是evalin函数的用法和eval的区别.evalin可调用不同范围的数据,如基本空间,主函数空间,和子函数空间.通过结果你可以发现明显的区别. 具体通过help evalin查看.

跨空间计算串表达式的值

本例演示:(A)编写绘制正多边形或圆的程序。(B)子函数与(母)函数的关系。(C)各种不同的工作空间。(D)evalin运行机理与eval的异同。
(1)[exm070531_1.m]文件如下:

  1. function y1=exm070531_1(a,s)
  2. t=(0:a)/a*2*pi;
  3. y1=subevalinzzy(4,s);
  4. %------------ subfunction -------------
  5. function y2=subevalinzzy(a,s)
  6. t=(0:a)/a*2*pi;ss='a*exp(i*t)';
  7. switch s
  8. case {'base','caller'}
  9. y2=evalin(s,ss);
  10. case 'self'
  11. y2=eval(ss);
  12. end
复制代码


(2)调用格式
  1. clear,a=30;t=(0:a)/a*2*pi;sss={'base','caller','self'};
  2. for k=1:3
  3. y0=exm070531_1(8,sss{k});
  4. subplot(1,3,k)
  5. plot(real(y0),imag(y0),'r','LineWidth',3),axis square image
  6. end
复制代码




还要注意各函数assignin,有相似的功能.

  1. >> help assignin
  2. ASSIGNIN Assign variable in workspace.
  3. ASSIGNIN(WS,'name',V) assigns the variable 'name' in the
  4. workspace WS the value V. WS can be one of 'caller' or 'base'.
复制代码

[ 本帖最后由 yejet 于 2006-11-11 16:01 编辑 ]
发表于 2005-9-21 16:57 | 显示全部楼层
<a href="http://luobo.yculblog.com/post.876803.html" target="_blank" >http://luobo.yculblog.com/post.876803.html</A>
发表于 2006-11-10 21:57 | 显示全部楼层
很不错,研究研究
发表于 2006-11-14 08:38 | 显示全部楼层
发表于 2006-11-14 09:43 | 显示全部楼层
谢谢
发表于 2006-11-14 09:54 | 显示全部楼层

有意思,艺无止境啊

发表于 2006-11-14 14:16 | 显示全部楼层
原帖由 xjtu211 于 2006-11-14 09:54 发表

是不是龙哥啊?
怎么在这逛阿?
发表于 2006-11-14 19:15 | 显示全部楼层
先研究研究!
发表于 2008-4-30 15:34 | 显示全部楼层
有意思,很好很强大!学习中...
发表于 2009-6-6 10:48 | 显示全部楼层
不错,好好学习
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-13 03:29 , Processed in 0.069093 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表