Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.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中将函数工作空间设置为base_Matlab_Function_Scope_Global_Workspace - Fatal编程技术网

在MATLAB中将函数工作空间设置为base

在MATLAB中将函数工作空间设置为base,matlab,function,scope,global,workspace,Matlab,Function,Scope,Global,Workspace,我有一个相当庞大的程序,我一直在从MATLAB命令行作为脚本运行。我决定用一些嵌套函数来清理它(我需要将所有内容都保存在一个文件中),但为了让它正常工作,我还需要将程序本身变成一个函数。因此,程序不再像脚本时那样在基本工作区中运行。这意味着我不再能够访问程序运行后保留的数十个有用变量,这些变量对于额外的计算和有关运行的信息非常重要 我可以找到的建议解决方法是使用assignin,evalin,将变量定义为全局变量,或者在现在函数化的程序定义中设置输出。然而,这些解决方案中没有一个对我有吸引力,我

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


我可以找到的建议解决方法是使用
assignin
evalin
,将变量定义为全局变量,或者在现在函数化的程序定义中设置输出。然而,这些解决方案中没有一个对我有吸引力,我真的很想找到一种方法来迫使工作区本身成为基础。有没有这样的解决办法?或者有没有其他方法不需要我手动定义或标记我想从函数中获取的每个特定变量?

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

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

我能想象的唯一不整洁的解决方法是使用WHO、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

如果要定义的函数很简单,并且只有一个输出,则可以使用一个选项

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

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

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

一种解决方法是运行
save('workspace')在函数末尾。然后在它运行之后,您可以运行
load('workspace')从命令行查看所有变量这绝对是迄今为止我所能看到的最简单的实现方法。谢谢特罗格多!如果还希望在出现错误后分配变量,请尝试添加
void=onCleanup(@variables2workspace)
在函数的开头,其中
variables2workspace
可以是这些答案中的一个函数。它在
void
被销毁时执行,即在函数结束或出现任何错误时。啊哈
eval
,请不要!我能解释一下为什么
eval
方法不好吗?乍一看,这似乎是我这方面工作最少的方法。
eval
在运行时进行评估。这不好的原因有很多。例如,编译器找不到错误。答案很好!我必须以函数的形式运行我的脚本,因为我需要子函数(这在脚本中是不可能的)。但当函数结束时,所有变量都超出范围并消失。使用您的解决方案,我可以再次像脚本一样运行函数包装的脚本。:)