使用cellfun检查工作空间中是否存在变量

Kat*_*tyB 9 matlab exists

请考虑以下示例:

dat1 = 1;
dat2 = 2;

Variables = {'dat1','dat2'};

a = cellfun(@(x)exist(x,'var'),Variables);

for i = 1:length(Variables);
    a2(i) = exist(Variables{i},'var');
end
Run Code Online (Sandbox Code Playgroud)

为什么'a'和'a2'返回不同的值,即为什么使用cellfun没有声明变量存在于工作空间中?我错过了什么?

Jon*_*nas 4

好吧,我想我明白这里发生了什么:

当您调用匿名函数时,它会像任何普通函数一样创建自己的工作区。但是,这个新工作区将无法访问调用者工作区。

因此

funH = @(x)exist(x,'var')
Run Code Online (Sandbox Code Playgroud)

'x'如果您作为输入 ( )提供,则只会返回 1 funH('x'),因为它的整个工作区由变量 组成'x'。

最后,

funH = @(x)exist('x','var') 
Run Code Online (Sandbox Code Playgroud)

无论您提供什么作为输入,都将始终返回 1。

有两种可能的方法来解决这个问题:

(1) 用于evalin在调用者的工作区中进行评估

 funH =  @(x)evalin('caller',sprintf('exist(''%s'',''var'')',x))
Run Code Online (Sandbox Code Playgroud)

(2) 使用 的输出whos,并对照现有变量列表进行检查

 Variables = {'dat1','dat2'};
 allVariables = whos;
 a3 = ismember(Variables,{allVariables.name})
Run Code Online (Sandbox Code Playgroud)