MATLAB-获取当前工作空间
在一个函数中,我想执行MATLAB-获取当前工作空间,matlab,workspace,Matlab,Workspace,在一个函数中,我想执行赋值(ws,'var',val),但此时我不知道工作区ws,它当前显示在matlab窗口的工作区窗口中。我正在寻找一条语句来替换上面语句中的ws 可能是一个简单且常见的问题,但我没有找到答案。您似乎想要的是在当前工作区中执行分配。但这在MATLAB中并不重要,因为这是基本任务: var = val; 其他两个可通过ws参数访问的工作区是: 'base',它是基本工作区(所有脚本都将在其中创建它们的变量) “调用者”,它是调用函数的工作区(此工作区在每次输入函数时创建,在
赋值(ws,'var',val)
,但此时我不知道工作区ws,它当前显示在matlab窗口的工作区窗口中。我正在寻找一条语句来替换上面语句中的ws
可能是一个简单且常见的问题,但我没有找到答案。您似乎想要的是在当前工作区中执行
分配。但这在MATLAB中并不重要,因为这是基本任务:
var = val;
其他两个可通过ws
参数访问的工作区是:
'base'
,它是基本工作区(所有脚本都将在其中创建它们的变量)
“调用者”
,它是调用函数的工作区(此工作区在每次输入函数时创建,在退出函数时销毁),或全局工作区(如果从脚本调用)
我使用了以下解决方法:
function main()
...
assignhere(name,value)
...
return
function assignhere(varname,varvalue)
assignin('caller',varname,varvalue);
return
尽管我更愿意从以下位置直接访问当前工作区:ws可以使用'base'或'caller'值来表示MATLAB®基本工作区或调用者函数的工作区。
为什么要这样做?@Dan,@user2271770对于任何询问为什么要这样做的人:变量名可能是一个原因<代码>变量名='myVar'。。。;eval(VarName)=1
不分配myVar
任何内容。相比之下,assignin('here',varName,1)
将是一个解决方案。至于eval([VarName'=1'])
,我从来不喜欢在eval(注入攻击)中包含很多潜在的未知内容。@bers我问这个问题的原因是,如果你发现自己使用变量名(或试图给范围外的变量赋值),我强烈建议,答案不是使用eval
和assignin
,而是重构代码,使其不再是necessary@excaza我同意它可能会通过global
关键字造成混淆,而该关键字不会在基本工作区中创建变量。但是这在MATLAB中是微不足道的,因为这是一个基本的任务:“这个句子由于语法的原因很混乱。此外,var=val如果从函数中调用,则代码>不会在工作区中分配var。@drmuelr对语法感到抱歉;我无法用更明确的措辞来表达这一点。至于另一个注释,我不敢苟同:var=val
将在当前工作区中分配变量var
(由函数调用创建并在函数退出后立即销毁的变量)。则不会在基本工作区中分配该变量。以下是关于这个主题的一些观点,以防您混淆函数工作区和基本工作区:询问者试图分配一个变量“当前显示在matlab窗口内的工作区窗口中”,这是基本工作区,因此这仍然令人混淆。“当在函数中调用var=val;
时,这与执行assignin('caller','var',val);
”相同吗?@drmuelr更令人困惑的是,工作区窗口根据代码的执行方式(运行或单步执行语句)显示不同的内容。'caller'
语法不会在当前工作区中赋值,而是在调用当前运行函数的函数的工作区中赋值。因此与var=val不同代码>。您确实可以直接访问当前工作区。这是一个奇怪的解决办法eval([name,'=',value])
做同样的事情。但是如果您发现自己需要这个,那么您确实需要重构代码。您不应该有“动态”变量名,也不应该使用字符串引用局部变量。改用单元格数组或结构数组。例如,您可以执行data.(name)=value
。