9

考虑以下示例:

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 没有说明变量存在于工作区中?我错过了什么?

4

2 回答 2

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})
于 2013-02-08T16:33:53.490 回答
2

我认为你应该把这cellfun一行写成:

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

使其等效于 for 循环。另请参阅如何existMatlab 的文档示例中使用...

编辑:

在(我想我)理解乔纳斯的回答之后,上面的行将始终返回 true,无论是否dat1=1dat1=[]。为了使用cellfun看到乔纳斯的回答......

于 2013-02-08T00:55:16.507 回答