在 Matlab 中使用 Globals 而不是传递大型数组

Posted

技术标签:

【中文标题】在 Matlab 中使用 Globals 而不是传递大型数组【英文标题】:Using Globals instead of passing large arrays in Matlab 【发布时间】:2012-07-25 13:16:27 【问题描述】:

我正在使用大型数组(每个大约 70 MB)并且担心将它们传递给函数。我的理解是 Matlab 使用传值函数参数,为被调用函数制作本地副本。

作为一个肮脏的解决方法,我一直将大型数组声明为全局数组,并在计算完成时手动取消分配它们。

我的问题: 有没有办法在 Matlab 中使用指针?这就是我在 C/C++ 中的做法。如果没有,还有其他更节省内存的方法吗?我读过全局变量通常是个坏主意。

【问题讨论】:

其实Matlab是通过引用传递的,除非它决定需要通过值传递...看这里的解释mathworks.com/matlabcentral/answers/… 这里还链接到进一步的讨论:blogs.mathworks.com/loren/2006/05/10/… 我之前在一个类似的问题中讨论过 MATLAB 如何将参数传递给函数。我想你会发现答案很有用:In-Place Quicksort in matlab 你的函数是只从数组中读取数据,还是直接操作数组的内容? 【参考方案1】:

@mutzmatron 在评论中回答了我的问题,所以这是一个转发:

实际上,Matlab 通过引用传递,除非它决定需要通过值传递...请参阅此处的解释: http://www.mathworks.com/matlabcentral/answers/...

【讨论】:

【参考方案2】:

我还到处读到,全球通常也是一个坏主意。而且,具体来说,我不同意。每个工具都有自己的用途。

我一直致力于优化代码,并发现,在提出的所有“更好的选择”中,在我的应用程序中使用 global 可以将代码的执行速度提高 20%!

该代码用于处理 GPS 信号...所有定义 GPS 信号某些特征的函数都使用了许多参数。此外,还有许多嵌套函数和对这些函数的迭代调用。

将单个参数传递给函数可能比该函数访问全局变量要快一些。在我的例子中,每个函数访问它需要的 3 或 4 个全局变量比将所有 10 个参数一直传递到嵌套函数链要快得多。

使用全局变量 8.5 秒的 tic-toc 比使用参数传递或嵌套函数的 10.5 秒快。那么,坏主意?我会表演的,谢谢。

我的观点?如果全局变量工作得更好,请使用全局变量。无论哪种方式都可以尝试...但是当您更改函数中的大数组时,该数组现在会在本地复制,而不仅仅是被引用。我宁愿查找全局然后制作 70MB 的副本。

在低级语言中,我同意尽可能避免使用全局变量……但这些语言提供指针和常量。 MATLAB 并不是为真正知道如何编程和如何优化的人设计的。如果口译员没有为您优化;看来你是 SOL。

【讨论】:

以上是关于在 Matlab 中使用 Globals 而不是传递大型数组的主要内容,如果未能解决你的问题,请参考以下文章

winform 窗体顺序问题

邮递员:我如何设置我的邮递员使用“pm”而不是“postman”

动态传参(*args **kwargs 无敌传参) 作用域globals locals和名称空间 函数的嵌套 关键字nonlcas global

在作为 GLOBALS 的函数中使用 Mysqli_connect 链接是不是安全?

在MATLAB中使用矩阵而不是向量进行引导?

Spyder中清楚变量,类似MATLAB中的clear all