使用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
Matlab 在启动时会自动运行脚本 startup.m。在这个脚本里可以自动修改当前目录,修改显示方式等等。比如
编程 » Matlab
第一步, which函数可用来获取 Matlab 函数的全路径(包含路径和文件名)。
编程 » Matlab
读者来信:
编程 » Matlab
写了一个统计代码量的函数,函数已 上传到 Matlab Central File Exchange 下载地址 ,使用方法:
没有人敢说 Matlab 的帮助文件不够详细和全面,但 Matlab 里面的确存在一些功能和函数,你很难找到它的帮助文档。下面列举一些,以后碰到其它的也会放到这里来:
编程 » Matlab, 并行计算
parfor适用于
编程 » Matlab, 并行计算
我们知道 Matlab 不支持多重 parfor 循环。下面代码会出错: