huright 发表于 2008-6-6 21:21

Matlab代码趣味编程大赛(一)------谢绝for循环

%author:huright
%date:2008年6月6日
%《Matlab原理与工程应用》P145习题
clc
clear
n=input('外接圆的个数\n');
r=2;
r1=r*sin(pi/n)/(1-sin(pi/n));
t = 0:.01:2*pi;
plot(r.*cos(t),r.*sin(t));
axis equal
hold on
theta=(0:(n-1))*(2*pi/n);
a=(r+r1).*cos(theta);
b=(r+r1).*sin(theta);
=meshgrid(a,r1.*cos(t));
=meshgrid(b,r1.*sin(t));
plot(xi+aa,yi+bb);
hold off这是《Matlab原理与工程应用》一书的一个习题,偶然看来,感觉有趣,尝试写了代码,运行结果如图,源代码已经给出。由于要求不用for循环。
相邻的圆是相切的。
假如你有学习Matlab的兴趣和时间,不妨尝试一下。记住“不用for循环”!!!
提示:是不是可以用极坐标实现?

[ 本帖最后由 huright 于 2008-6-6 21:27 编辑 ]

rocwoods 发表于 2008-6-7 03:21

响应bainhome的号召,来个用到arrayfun函数的做法。由于这个函数是7.1后才有的,目前使用的人不多。希望借此让更多的人了解其用法。很多时候用起来还是很方便的。详细用法可以参考帮助文档。n=input('外接圆的个数\n');
r=2;
r1=r*sin(pi/n)/(1-sin(pi/n));
t = 0:.01:2*pi;
plot(r.*cos(t),r.*sin(t));
axis equal
hold on
theta=(0:(n-1))*(2*pi/n);
a=(r+r1).*cos(theta);
b=(r+r1).*sin(theta);
arrayfun(@(a,b) plot(r1*cos(t)+a,r1*sin(t)+b),a,b)

bainhome 发表于 2008-6-7 03:39

今天偶然看到这个帖子,直觉认为arrayfun可以圆满解决。但是就这个函数而言,我并不是最好的人选,简单试了两下没试出来就游戏去了,因此推荐rocwoods来做。
PS:现如今的循环,在MATLAB中虽然不能说是个“长相羞走林青霞、唱歌气坏王靖雯”的功能,但至少也不是笑傲江湖里的李YP,摆“S”pose的芙蓉JJ能比。即使是恐龙,人家也开始涂脂抹粉装腔作势了,晚上碰见,其实也不那么吓人了,没必要奔走相告非要顶风躲十里,用个循环跟和如花被逼洞房似的:lol 。现在我写代码,原则一向是能用就行:怎么快、怎么简单怎么来,把合理运行条件考虑好,多加判断流程,易于维护即可。等需要考虑速度的时候再考虑速度,未必就来不及,因为真要写这种代码,也不一定比大多数人差哦:victory:

[ 本帖最后由 bainhome 于 2008-6-7 03:46 编辑 ]

huright 发表于 2008-6-7 21:05

大家对Matlab掌握的熟练程度不同,编写出来的代码就会有差异。
实际编程时,“解决问题”至上。
平时学习时,养成良好的变成习惯也很重要。
欢迎大家跟帖代码,不同的角度,会带来不一样的感受:victory:
页: [1]
查看完整版本: Matlab代码趣味编程大赛(一)------谢绝for循环