请考虑以下示例:
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
Run Code Online (Sandbox Code Playgroud)
为什么'a'和'a2'返回不同的值,即为什么使用cellfun没有声明变量存在于工作空间中?我错过了什么?
好吧,我想我明白这里发生了什么:
当您调用匿名函数时,它会像任何普通函数一样创建自己的工作区。但是,这个新工作区将无法访问调用者工作区。
因此
funH = @(x)exist(x,'var')
Run Code Online (Sandbox Code Playgroud)
'x'如果您作为输入 ( )提供,则只会返回 1 funH('x'),因为它的整个工作区由变量 组成'x'。
最后,
funH = @(x)exist('x','var')
Run Code Online (Sandbox Code Playgroud)
无论您提供什么作为输入,都将始终返回 1。
有两种可能的方法来解决这个问题:
(1) 用于evalin在调用者的工作区中进行评估
funH = @(x)evalin('caller',sprintf('exist(''%s'',''var'')',x))
Run Code Online (Sandbox Code Playgroud)
(2) 使用 的输出whos,并对照现有变量列表进行检查
Variables = {'dat1','dat2'};
allVariables = whos;
a3 = ismember(Variables,{allVariables.name})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7902 次 |
| 最近记录: |