使用Matlab的函数包实现命名空间

作者:, 发表于

在写Matlab程序时,函数的命名方式让人头疼,很难保证刚写的一个函数名在很久以前被用过,成为隐藏的一颗炸弹。

1.使用方法

从7.6开始,Matlab引入了函数包,可以将若干函数(以及类!)放到一个文件夹下,可实现命名空间的效果,如例:

+mypack
+mypack/pkfcn.m % a package function
+mypack/@myClass % class folder in a package

使用 help mypack 一次性列出mypack包下所有函数,这些函数可以通过以下方式引用:

z = mypack.pkfcn(a, b);
obj = mypack.myClass(arg1,arg2,...);

还可以建立多重包

+mypack/+pack2/fun.m

同样的方式引用:

z = mypack.pack2.fun(x, y);

2.效率

函数包实现函数命名空间会增加函数调用的开销。验证方法是建立一个普通函数testadd

function s = testadd(a, b)
s = a + b;

同时将该函数复制到函数包+test下。我可以使用下面三句语句检查运行效率:

tic; s = 0; for i = 1:1e6, s = s + i; end; toc; % 0.015344s
tic; s = 0; for i = 1:1e6, s = testadd(s, i); end; toc; % 0.556452s
tic; s = 0; for i = 1:1e6, s = test.testadd(s, i); end; toc; % 9.296256s

从第一条语句看,循环和计算加法所需的时间可忽略不计(百万次运行的量级上)。第二条语句的结论是200万次函数调用大约需1秒钟。第三条语句说明,同样的函数,若通过函数包调用,效率会降低到10万次调用就需要1秒钟。函数包的效率比普通函数慢20倍。

即使用下面这种方式预先申明函数也不行:

a = @test.testadd; 
tic; s = 0; for i = 1:1e6, s = a(s, i); end; toc; % 10.391726s

所以如果一个函数被调用多次(比如上百万次),最好还是别用函数包的形式,老老实实取一个不常见的函数名来避免函数名字冲突。

Q.E.D.


上一篇:Matlab的parfor的使用条件2014年7月20日
parfor适用于 大量的简单计算的循环。 大量或少量的复杂计算的循环。 不建议在少量的简单计算的循环中使用parfor,因为parfor本身有计算的损耗

下一篇:如何实现Matlab多重parfor循环2014年8月20日
Matlab不支持多重parfor循环,这里提供一种简单的变通方法。


  • 支持使用微薄、微信和QQ的账户登陆进行评论。由各自网站直接认证,不会泄露你的密码。
  • 登陆后可选择分享评论到所绑定的社交网络,如微薄、人人和QQ空间。
  • 评论提交后无法修改。如需修改,请删除原评论再重新提交。
  • 评论支持LaTeX代码,行内公式请用\(a+b=c\),行间公式请用\[a+b=c\]。公式只支持英文字符。