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

时间:2013-02-07 22:18:49

标签: 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

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

2 个答案:

答案 0 :(得分:4)

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

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

因此

funH = @(x)exist(x,'var')
如果您提供'x'作为输入(funH('x')),

将只返回1,因为其整个工作空间由变量'x'组成。

因此,

funH = @(x)exist('x','var') 
无论您提供什么输入,

将始终返回1。

有两种可能的方法:

(1)使用evalin在呼叫者的工作空间中进行评估

 funH =  @(x)evalin('caller',sprintf('exist(''%s'',''var'')',x))

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

 Variables = {'dat1','dat2'};
 allVariables = whos;
 a3 = ismember(Variables,{allVariables.name})

答案 1 :(得分:2)

我认为您应该将cellfun行写为:

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

使其等效于for循环。 另请参阅Matlab's Documentation示例中的exist使用方法......

修改

在(我认为我是)了解Jonas的答案之后,无论dat1=1还是dat1=[],上述行总是会返回true。为了使用cellfun,请参阅Jonas回答......