Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我在MATLAB中是否通过声明全局变量而不是将其作为参数传递来节省内存?_Matlab_Memory Management - Fatal编程技术网

我在MATLAB中是否通过声明全局变量而不是将其作为参数传递来节省内存?

我在MATLAB中是否通过声明全局变量而不是将其作为参数传递来节省内存?,matlab,memory-management,Matlab,Memory Management,我是新来MATLAB的,它不在工作描述中,我被迫接替编写和维护我公司使用的代码的人。生活很艰难 我接手的那个家伙告诉我,为了节省内存,他将所有大数据向量声明为全局。更具体地说,当一个函数调用另一个函数时,他在传递数据时不会创建数据的副本 这是真的吗?我读过,上面写着 在处理大型数据集时,请注意,如果调用的函数修改了输入变量的值,则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