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

作者: , 共 1029 字

在写 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 还是本科的时候,当时还是 5.3 版,现在重新尝试它,已经是 7.8 ( R2009a ),而且 R2010b 版都已经发售。而这些版本引入的一个新玩意儿便是面向对象化编程( object-oriented programming , OOP )。
编程 » Matlab, 并行计算
我们知道 Matlab 不支持多重 parfor 循环。下面代码会出错:
最近用 Matlab 写了个东西,运行效率不如我意。用 Profiler 跟踪了一下,结果让我大吃一惊。其中三分之一的时间花费在 datestr 这个函数上,六分之一的时间花费在 save 和 load 数据上。这里先谈前一个问题,关于 save 和 load 的效率以后再谈。
相似度: 0.090
最近写了一些 Matlab 程序,想起以前想过的一个东西,记录一下。
上次说起遇到两个 Matlab 的效率问题,还剩下 save , load 没说。不过这个问题的结论挺简单的,就是在 save 的时候尽量指定使用-v6 选项。
本文结论:不要过度担心 Matlab 的传值调用的效率问题。
相似度: 0.059
编程 » Matlab, 代码准则
我所在部门也不是 IT 部门,职位也不是开发职位,但平时工作还是需要大量处理和分析数据、计算和开发各种指标等,还是需要写很多程序,语言以 VBA 和 Matlab。但同时,部门里像着我这种写程序的人并不多,别人并不看我的代码而只关心我提交的结果(说实话,大多数时候即便我写错了也不会有人知道),工作环境也不像专业的 IT 公司或部门,有严格的流程控制和工作平台。我这里没有版本控制、没有自动测试环境、没有代码格式和注释要求,也不需要去 Linux 下干活。我相信国内金融行业有不少人与我处于同样的状态。
编程 » Matlab
第一步,which函数可用来获取 Matlab 函数的全路径(包含路径和文件名)。
编程 » Matlab
Matlab 在启动时会自动运行脚本startup.m。在这个脚本里可以自动修改当前目录,修改显示方式等等。比如
没有人敢说 Matlab 的帮助文件不够详细和全面,但 Matlab 里面的确存在一些功能和函数,你很难找到它的帮助文档。下面列举一些,以后碰到其它的也会放到这里来:
编程 » Matlab, 并行计算
parfor适用于
编程 » Matlab, 并行计算
我们知道 Matlab 不支持多重 parfor 循环。下面代码会出错: