找回密码
 注册
Simdroid-非首页
查看: 187|回复: 4

arrayfun函数使用要慎重

  [复制链接]
发表于 2010-12-26 23:44:16 | 显示全部楼层 |阅读模式 来自 北京
本帖最后由 rocwoods 于 2011-1-6 22:34 编辑

记得我是在2007年左右开始在本版推荐使用arrayfun函数(http://forum.simwe.com/viewthread.php?tid=792777)。这个函数本质上来说是方便了循环体的简写,但是从效率上讲,由于循环机制和“MATLAB根正苗红的纯粹向量化”以及MATLAB本身不断改进的循环机制不同,它并未提高循环效率,由于新的MATLAB版本循环不断优化,在2010b中,它的效率甚至比循环低不少。因此大家千万不要被它“伪向量化”的光环所迷惑。它的使用应该是在追求代码形式简洁而对效率要求不是很严格的场合。
而且由于它的“形式上”向量化一切标量函数的机制,使得它可以应用在一些特殊场合,譬如求非规则区域的多重积分(http://forum.simwe.com/viewthread.php?tid=885049&highlight=
http://forum.simwe.com/viewthread.php?tid=790492&page=3
http://forum.simwe.com/viewthread.php?tid=886674&highlight=
)
但是这样做效率比用循环是不高的,大家可以看下面这个简单的例子:

  1. >> clear
  2. >> x = 1:1000000;
  3. >> tic;y = x.^2;toc
  4. Elapsed time is 0.011385 seconds.
  5. >> tic;z = arrayfun(@(x)x^2,x);toc
  6. Elapsed time is 10.828575 seconds.
  7. >> isequal(z,y)
  8. ans =
  9.      1
  10. >> tic;for k =1:1000000;z(k) = x(k)^2;end;toc
  11. Elapsed time is 0.056217 seconds.
  12. >> isequal(z,y)
  13. ans =
  14.      1
复制代码
可以看出,在这个例子上arrayfun的效率是典型向量化的千分之一左右,也远远小于循环的效率。正宗的循环效率从数量级上来说,已经和向量化相差不太大了,之所以慢,绝大部分是大量重复调用函数导致的额外开销所致。因此基于此考虑,我在书中提倡的向量化编程的一点准则是:在内存许可前提下,变“勤拿少取”为“少拿多取”。


后记:这个帖子关于arrayfun效率和循环效率的比较值得商榷。关于arrayfun函数深入讨论见http://forum.simwe.com/thread-966038-2-1.html

评分

1

查看全部评分

发表于 2010-12-26 23:58:25 | 显示全部楼层 来自 北京海淀
Simdroid开发平台
坦白说,用MATLAB的,很多人要的只是方便,真在乎效率的不太多,比如看看那么多初学MATLAB的,syms到处乱用就知道了,甚至离奇的是居然还见到论坛有人用符号方程求解命令solve去编写牛顿-拉弗森公式的代码,讽刺意味真是浓到不能再浓。
这个前提下,这个函数还是很有提倡的意味的,我主要是指对函数句柄的批量操作,而不是对具体数据的操作。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-27 00:08:08 | 显示全部楼层 来自 北京
本帖最后由 rocwoods 于 2010-12-27 00:13 编辑

确实很多用MATLAB的人不注意效率,比如bainhome说的用solve sym计算 编数值计算程序,而且一些基本的编程规则不注意,写出的程序自然慢的要死,在享受到MATLAB便利的同时,狂贬MATLAB速度堪比蜗牛。我想这点qibbxxt深有体会。
毕竟arrayfun函数还远未普及,很多人对这个函数还不知晓,看到这个帖子的人也不会很多,所以看到这个帖子的各位就当是给您提个醒儿,没看到也无所谓。
回复 不支持

使用道具 举报

发表于 2010-12-27 09:33:57 | 显示全部楼层 来自 河北廊坊
恩,其实两位是从不同角度说,很多事情往往难以两全集美,况且效率一方面也取决于matlab内置函数本身
如果从效率方面来说,应该不大考虑代码的简洁,这个在规模大的计算中,显得很重要,对于arrayfun的构造需要技巧来优化其速度,arrayfun本身的效率某些情况下并不高,加上初学者不大会用,花了很多时间去构造使用,然后效率变化不大或者起了反作用,这样就不值得了
如果从matlab的艺术性来说,简洁是大家追求的一个方面,我本人也追求,以至于有时候为了追求简洁,“浪费”很多时间,另一方面程序的可读性很差,不利用大家交流

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-12-27 17:33:36 | 显示全部楼层 来自 山东淄博
测试了一下,在Forcal中arrayfun函数比循环要快些,这可能是Forcal函数调用效率高的缘故。

感觉代码清晰易懂比代码简洁更重要。

评分

1

查看全部评分

回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-5 05:18 , Processed in 0.041322 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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