Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 使用cellfun检查工作区中是否存在变量_Matlab_Exists - Fatal编程技术网

Matlab 使用cellfun检查工作区中是否存在变量

Matlab 使用cellfun检查工作区中是否存在变量,matlab,exists,Matlab,Exists,考虑以下示例: 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不声明变量存在于工作区中?我遗漏了什么?我想你应该把cellfun行写为: a = c

考虑以下示例:

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不声明变量存在于工作区中?我遗漏了什么?

我想你应该把
cellfun
行写为:

a = cellfun(@(x) exist('x','var'),Variables); 
使其等效于for循环。 另请参见示例中如何使用
exist

编辑:


在(我想我)理解了乔纳斯的答案之后,无论是
dat1=1
还是
dat1=[]
,上面的那一行总是会返回true。为了使用cellfun请参见Jonas回答…

好的,我想我理解这里发生的事情:

当您调用匿名函数时,它会像任何普通函数一样创建自己的工作区。但是,此新工作区将无法访问调用者工作区

因此

仅当您提供
'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。可以访问环境-and-2中的变量。保留正确的参数类型。两者都是真的,这真的很奇怪。在我看来,您刚刚在
cellfun
exist
中发现了bug!恭喜:)@Kate:你缺少的是每个匿名函数都有自己的工作区(我也花了一段时间)。请看下面我的答案。我错了。无论输入是什么,您的函数都将始终返回true。从cellfun上的示例来看,它没有显示
x
应该放在引号之间
Cpositives=cellfun(@(x)x(x>0),C,'UniformOutput',false)
因此我认为这不是问题所在。我有点困惑。如果新的工作区不能访问调用者的工作区,这个代码如何
b=3;feval(@(x)b+x,2)
返回
5
然后呢?请解释一下好吗?@zplesivcak:在匿名函数的定义中添加
b
时,您将其副本添加到匿名函数的工作区中。如果在定义匿名函数后更改
b
的值,则匿名函数中的
b
不会更改。
 Variables = {'dat1','dat2'};
 allVariables = whos;
 a3 = ismember(Variables,{allVariables.name})