考虑以下示例:
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没有声明工作空间中存在变量?我错过了什么?
答案 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回答......