考虑以下示例:
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 没有说明变量存在于工作区中?我错过了什么?
好的,我想我明白这里发生了什么:
当您调用匿名函数时,它会创建自己的工作区,就像任何普通函数一样。但是,此新工作区将无权访问调用方工作区。
因此
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})
我认为你应该把这cellfun
一行写成:
a = cellfun(@(x) exist('x','var'),Variables);
使其等效于 for 循环。另请参阅如何exist
在Matlab 的文档示例中使用...
编辑:
在(我想我)理解乔纳斯的回答之后,上面的行将始终返回 true,无论是否dat1=1
或dat1=[]
。为了使用cellfun
看到乔纳斯的回答......