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