我在MATLAB中是否通过声明全局变量而不是将其作为参数传递来节省内存?
我是新来MATLAB的,它不在工作描述中,我被迫接替编写和维护我公司使用的代码的人。生活很艰难 我接手的那个家伙告诉我,为了节省内存,他将所有大数据向量声明为我在MATLAB中是否通过声明全局变量而不是将其作为参数传递来节省内存?,matlab,memory-management,Matlab,Memory Management,我是新来MATLAB的,它不在工作描述中,我被迫接替编写和维护我公司使用的代码的人。生活很艰难 我接手的那个家伙告诉我,为了节省内存,他将所有大数据向量声明为全局。更具体地说,当一个函数调用另一个函数时,他在传递数据时不会创建数据的副本 这是真的吗?我读过,上面写着 在处理大型数据集时,请注意,如果调用的函数修改了输入变量的值,则MATLAB会生成输入变量的临时副本。这会临时将存储阵列所需的内存增加一倍,如果没有足够的内存,则会导致MATLAB生成错误 它说了一些非常相似的事情: 将变量传递给函
全局
。更具体地说,当一个函数调用另一个函数时,他在传递数据时不会创建数据的副本
这是真的吗?我读过,上面写着
在处理大型数据集时,请注意,如果调用的函数修改了输入变量的值,则MATLAB会生成输入变量的临时副本。这会临时将存储阵列所需的内存增加一倍,如果没有足够的内存,则会导致MATLAB生成错误
它说了一些非常相似的事情:
将变量传递给函数时,实际上是在传递对该变量表示的数据的引用。只要输入数据没有被调用的函数修改,调用函数中的变量和被调用函数中的变量就指向内存中的同一位置。如果被调用函数修改了输入数据的值,那么MATLAB将在内存中的新位置复制原始数组,用修改后的值更新该副本,并将被调用函数中的输入变量指向该新数组
那么,使用
global
会更好吗?轻松地将所有大数据声明为global
,而不是确保所有代码都不会修改其输入参数,这似乎有点草率。我错了吗?这真的提高了RAM的使用率吗?根据我的经验,如果没有任何代码修改大数据,那么内存使用率是相同的,不管您使用的是全局变量还是输入参数,就像Matlab文档所说的那样。更多信息由MathWorks员工提供
在Matlab中有很多关于性能问题的民间传说,但并非都是正确的。Matlab的内部结构已经发生了很大的变化。可能在以前的版本中,最好使用全局变量。这个解决方案对我来说有点奇怪。正如您已经发现的,如果被调用的函数不修改数据数组,那么它不应该对内存使用产生重大影响。但是,如果调用的函数修改了数据数组,则会有一个功能上的差异:在一种情况下(使数据数组成为全局的),更改会影响代码的其余部分,在另一种情况下(将其作为引用传递),修改只是局部的和临时的。我认为您基本上回答了自己的问题,但这里有更多的参考资料会很好: 我制作了一个视频: 类似于Loren在这里所说的:
-Dogu这个答案可能有点无关紧要,但这里需要提到的另一个主题是如何使用来管理内存 正如在其他答案中已经确定的那样,如果传递给函数的数据未被修改(因为它将通过引用传递),则无需使用
全局
变量。如果对其进行了修改(因此按值传递),则改用全局
变量将节省内存。但是,global
变量可能有点“粗俗”,原因如下:
- 您必须在任何需要它们的地方进行声明,如
global varName
- 从概念上讲,试图跟踪修改的时间和方式可能有点混乱,特别是当它们分布在多个m文件中时
- 用户可以很容易地用一个位置不正确的命令来破坏代码,该命令会清除所有全局变量
global
变量的另一种替代方法是:嵌套函数。紧跟在您引用的引用后面的是一个代码示例(我在这里的格式略有不同):
在本例中,函数
setrowval
嵌套在函数myfun
中。myfun
工作区中的变量A
可在setrowval
中访问(就好像它已在每个工作区中声明为global
)。嵌套函数修改此共享变量,从而避免任何额外的内存分配。您不必担心用户无意中清除了任何内容,而且(在我看来)它比声明global
变量更干净、更容易操作。为什么不监视RAM使用情况,看看有什么更好的方法?我不认为你的问题与其他任何性能问题不同。你需要分析你的代码。似乎您可以编写两个循环,并测试当代码更改输入数据时,作为全局变量或函数输入的变量是否更好(如果更改了,因为更改时内存仅“加倍”)。很抱歉没有给出答案,但是在性能问题上有太多的问题。你的回答完全正确,但我还是问了这个问题,因为我担心这是一个编码风格问题,而不仅仅是内存问题。哦,好吧……一些可能有用的东西:“内存配置文件”将跟踪MatlabProfiler中的分配。如果您使用的是R2008a+,新样式的“句柄”对象可以通过引用传递,这将节省内存,但比全局对象具有更好的范围控制。+1和酷的答案,也适用于使用Loren的博客。她是这里的用户-
function myfun
A = magic(500);
setrowval(400, 0);
disp('The new value of A(399:401,1:10) is')
A(399:401,1:10)
function setrowval(row, value)
A(row,:) = value;
end
end