matlab 传值,Matlab 的传值调用的效率问题

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

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

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

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

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 函数:

functiona =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

functiona =subtest(m)

a = m;

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

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

Q. E. D.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
Matlab是一种非常强大的数学计算工具,而Cplex则是一种常用的数学优化软件。通过将Matlab与Cplex结合使用,我们可以解决各种复杂的优化问题。 下面是一个使用Matlab调用Cplex求解优化问题的编程案例。 假设我们有20个任务需要分配给5个工人,每个任务分派给一个工人后,会产生不同的效益,我们的目标是最大化总效益。同时,每个工人有能力限制,即每个工人只能完成一定数量的任务。 首先,我们需要在Matlab环境中安装并配置Cplex,使其能够与Matlab进行交互。然后,我们可以使用Matlab的优化工具箱和Cplex函数来构建该问题的数学模型。 假设任务效益存储在一个20x5的矩阵benefits中,工人能力限制存储在一个5x1的向量capacity中。 我们可以使用二进制变量x(i,j)表示第i个任务是否分配给第j个工人,优化目标是最大化总效益。同时,我们还需要加入约束条件,即每个任务只能分配给一个工人,每个工人的任务数量不能超过能力限制。 通过使用Matlab的优化工具箱中的整数线性规划函数和Cplex的相关函数,我们可以构建出该问题的数学模型,并调用Cplex进行求解。 最后,我们可以通过将Cplex求解的结果在Matlab中进行处理和分析,得到最优的任务分配方案以及对应的总效益。 通过这个案例,我们可以看到如何使用Matlab调用Cplex求解优化问题。这种方法不仅可以应用于任务分配问题,还可以用于解决更加复杂的优化问题,如物流路径优化、生产调度等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值