【问题标题】:Set function workspace to base in MATLAB在 MATLAB 中将函数工作区设置为基础
【发布时间】:2014-08-06 19:23:06
【问题描述】:

我有一个相当庞大的程序,我一直作为脚本从 MATLAB 命令行运行。我决定使用一些嵌套函数对其进行一些清理(我需要将所有内容保存在一个文件中),但为了使其工作,我还需要使程序本身成为一个函数。因此,该程序不再像它作为脚本时那样在基础工作区中运行。这意味着我不再可以访问在程序运行后保留的数十个有用变量,这些变量对于额外的计算和有关运行的信息很重要。

我能找到的建议解决方法是使用assigninevalin,将变量定义为全局变量,或者在现在函数化程序的定义中设置输出。然而,这些解决方案都不吸引我,我真的很想找到一种方法来强制工作空间本身为基础。是否存在任何此类解决方法?或者有没有其他方法不需要我手动定义或标记我想退出函数的每个特定变量?

【问题讨论】:

  • 一种解决方法是在函数结束时运行save('workspace');。然后在它运行之后你可以从命令行运行load('workspace');来查看所有变量
  • 据我所知,这绝对是最简单的方法。谢谢特罗格多!
  • 如果您还希望在发生错误后分配变量,请尝试在函数的开头添加 void = onCleanup(@variables2workspace);,其中 variables2workspace 可以是任何这些答案中的函数。它在void 被销毁时执行,即在函数结束或任何错误时执行。

标签: matlab function scope global workspace


【解决方案1】:

函数应明确定义输入和输出变量。以不同的方式组织代码将更难理解和以后修改。最后,与投资重组相比,采用非正统风格工作很可能会花费您更多的时间。

如果您有大量的输出变量,我建议将它们组织在structure arrays 中,这可能很容易作为输出变量处理。

我能想到的唯一不整洁的解决方法是使用 whos、assignin 和 eval:

function your_function()
   x = 'hello' ;
   y = 'world' ;

   variables = whos ;
   for k=1:length(variables)
      assignin('base',variables(k).name,eval(variables(k).name))
   end
end

但我怀疑这是否有助于清理您的程序。如上所述,我建议在结构中手动排序:

function out = your_function()
   x = 'hello' ;
   y = 'world' ;

   out.x = x ;
   out.y = y ;
 end

【讨论】:

  • eval,请不要!
  • 我能否解释一下为什么eval 方法不好?乍一看,这似乎是我工作量最少的方法。
  • eval 在运行时进行评估。这不好的原因有很多。例如编译器找不到错误。
  • 很好的答案!我必须将我的脚本作为函数运行,因为我需要子函数(这在脚本中是不可能的)。但是当函数结束时,所有变量都会超出范围并消失。使用您的解决方案,我可以再次像脚本一样运行我的函数包装脚本。 :)
【解决方案2】:

如果您要定义的函数很简单并且只有一个输出,那么一种选择是使用anonymous functions

另一种选择是将以后要使用的所有变量存储在 struct 中,并让您的大函数将此 struct 作为输出返回。

function AllVariables = GlobalFunction(varargin);
% bunch of stuff

AllVariables= struct('Variable1', Variable1, 'Variable2', Variable2, …);
end

【讨论】:

    猜你喜欢
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多