Matlab 的传值调用的效率问题

作者: , 共 1315 字

本文结论:不要过度担心 Matlab 的传值调用的效率问题。

刚学 Matlab 的时候便被告诉 Matlab 的函数的参数都是通过传值调用( call by value ),它的特点是在函数内部对于参数的修改不会影响外面的值。

传值调用参数时,函数内部复制了参数的一份副本。在大多数情况下,这种复制操作的消耗很小,但如果参数对象很大的话(比如为一个 1000×1000 的矩阵),这样的操作会大大降低函数运行的效率,增加函数调用占用的内存(复制一份对象需要增加使用 80M 内存)。

幸运的是, Matlab 对此进行了优化,如果该参数在函数内部没有被修改,那么在实现时,它实质上用的是传引用调用( call by reference )

http://www.mathworks.com/support/solutions/en/data/1-15SO4/index.html?solution=1-15SO4

For MATLAB built-in data types, MATLAB always passes arguments 'by value' in the sense that any changes made to input arguments within a function are not visible to the respective variables in the caller workspace.

However, since passing huge chunks of data 'by value' is inefficient, MATLAB internally optimizes for some cases and passes by reference and only creates local copies if modifications are being made to these arguments.

可测试下面的 test 函数:

function a = test(m, t)

if t > 0
    if t == 0
        m(1, t) = t;
    end
    m = subtest(m);
    a = test(m, t-1) + 1;
else
    a = 1;
end

function a = subtest(m)
a = m;

比如测试 test(rand(1000), 200)。如果函数是使用传值调用,那么它早就奔溃了(因为在 200 次递归中共需要 80M×200=16G 内存)。但实际测试中,程序能在 1 秒钟内给出结果,内存占用也很少。事实上,在程序实际运行的过程中使用的是传引用调用的方式。

更进一步地说,Matlab 在程序运行过程中而不是编译的时候(或者刚进入函数的时候)确定用哪种方式调用参数。所以即使发生了赋值操作,只要赋值不修改变量的值(比如 a=a 这样的赋值), Matlab 不会生成副本。只有在变量的值被实质修改时,程序才会生成一个临时副本。

Q. E. D.

类似文章:
相似度: 0.147
最近写了一些 Matlab 程序,想起以前想过的一个东西,记录一下。
上次大规模使用 Matlab 还是本科的时候,当时还是 5.3 版,现在重新尝试它,已经是 7.8 ( R2009a ),而且 R2010b 版都已经发售。而这些版本引入的一个新玩意儿便是面向对象化编程( object-oriented programming , OOP )。
编程 » Matlab, swap, 函数包
Matlab 程序效率低下,其中一个原因就是它的参数无法引用,每次都是传值。这不但导致效率问题,要实现某些功能,也需要一些特殊的手段。比如最简单的,如果交换两个变量的值,也就是在 C/C++里的函数 void swap(int& a, int& b),在 C/C++里实现很容易,但在 Matlab 里,你会吗?
相似度: 0.109
以下对并行计算的个人理解受到较多质疑,删除之。
没有人敢说 Matlab 的帮助文件不够详细和全面,但 Matlab 里面的确存在一些功能和函数,你很难找到它的帮助文档。下面列举一些,以后碰到其它的也会放到这里来:
上次说起遇到两个 Matlab 的效率问题,还剩下 save , load 没说。不过这个问题的结论挺简单的,就是在 save 的时候尽量指定使用-v6 选项。
相似度: 0.087
编程 » Matlab, 代码准则
我所在部门也不是 IT 部门,职位也不是开发职位,但平时工作还是需要大量处理和分析数据、计算和开发各种指标等,还是需要写很多程序,语言以 VBA 和 Matlab。但同时,部门里像着我这种写程序的人并不多,别人并不看我的代码而只关心我提交的结果(说实话,大多数时候即便我写错了也不会有人知道),工作环境也不像专业的 IT 公司或部门,有严格的流程控制和工作平台。我这里没有版本控制、没有自动测试环境、没有代码格式和注释要求,也不需要去 Linux 下干活。我相信国内金融行业有不少人与我处于同样的状态。
编程 » Matlab
在写 Matlab 程序时,函数的命名方式让人头疼,很难保证刚写的一个函数名在很久以前被用过,成为隐藏的一颗炸弹。
最近用 Matlab 写了个东西,运行效率不如我意。用 Profiler 跟踪了一下,结果让我大吃一惊。其中三分之一的时间花费在 datestr 这个函数上,六分之一的时间花费在 save 和 load 数据上。这里先谈前一个问题,关于 save 和 load 的效率以后再谈。
编程 » Excel, VBA
无意中发现一个 Excel VBA 对待参数的一个"不正常"现象。这种处理方式可能无意中导致程序结果错误,而且你很难发现你的错误所在:
数学 » 头脑风暴
发信人: GGGGDDDDK (忠贾诩发动乱武,反华佗没法急救别人了), 信区: SanGuoSha
标   题: 据说此题是入职腾讯游戏策划部门一道题 zz
发信站: 水木社区 (Mon Sep 20 11:10:40 2010), 站内
编程 » Matlab, 优化
最近做了些东西,用到了 Matlab 的优化工具箱, optimization toolbox。因为以前没用过这东西,今天把这个工具箱的帮助文档基本上翻了一遍。