考虑以下示例:
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})
我是一名优秀的程序员,十分优秀!