在MATLAB中将函数工作区设置为基本工作区

4
我有一个相当庞大的程序,之前是在MATLAB命令行中作为脚本运行。我决定用一些嵌套函数来对程序进行清理(需要将所有内容放在一个文件中),但为了让它工作,我还需要将程序本身变成一个函数。结果,这个程序不再像脚本那样在基本工作区中运行。这意味着我不再可以访问在程序运行后留下的数十个有用变量,这些变量对于额外的计算和关于运行的信息很重要。
可以找到的建议性解决方案是使用`assignin`,`evalin`,将变量定义为全局变量,或在现在函数化的程序定义中设置输出。然而,我并不喜欢这些解决方案,并且我真的想找到一种强制工作区本身转换为基本工作区的方法。是否存在这样的解决方案?或者是否有其他方法可以做到这一点,而不需要手动定义或标记我想要从函数中取出的每个特定变量?

2
一个解决方法是在函数结尾处运行 save('workspace');。然后在它运行完毕后,你可以从命令行运行 load('workspace'); 来查看所有的变量。 - Trogdor
这绝对是目前我所看到的最简单的方法来实现我想要的。谢谢Trogdor! - A Blue Shoe
如果您希望变量在出现错误后仍能被赋值,请尝试在函数开头添加 void = onCleanup(@variables2workspace);,其中 variables2workspace 可以是这些答案中的任何一个函数。它会在 void 被销毁时执行,即在函数结束或出现任何错误时执行。 - Scz
给未来的读者一个提示:现在可以在脚本文件中使用局部函数了。这些函数必须在脚本之后、文件末尾定义。在提问时,这种方式还不可行。 - Cris Luengo
2个回答

2
函数应该清晰地定义输入和输出变量。以不同的方式组织代码将更难理解和修改。最终,使用非正统风格可能比投资于一些重构更需要花费更多时间。
如果您有大量的输出变量,我建议将它们组织在结构数组中,这可能很容易处理为输出变量。
我能想象的唯一凌乱的解决方法是使用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,拜托别用! - Cape Code
我能否得到一个关于为什么eval方法不好的解释?乍一看,它似乎是需要我付出最少工作量的方法。 - A Blue Shoe
1
eval 在运行时被评估。有很多原因为什么这是不好的。例如编译器无法找到错误。 - patrik
1
太棒了!我必须将我的脚本作为函数运行,因为我需要子函数(而这在脚本中是不可能的)。但是当函数结束时,所有变量都会超出范围并消失。有了你的解决方案,我可以像运行脚本一样运行我的函数封装的脚本。 :) - Edgar

0

如果您想定义的函数很简单且只有一个输出,一种选择是使用匿名函数

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接