我正在尝试理解Matlab中的范围,我有点困惑。根据我从互联网上收集的内容,我知道如果在主函数中定义了变量,嵌套函数将在其工作空间中看到该变量。例如
function test = myfun(x)
a = 1;
function test = myfun2(x)
test = x + a;
end
test = x + myfun2(x);
end
>>myfun(1)
3 #Yay it worked.
但是,如果我将myfun
和myfun2
分成单独的.m文件,我会收到错误消息。例如
function test = myfun(x)
a = 1;
test = x + myfun2(x);
end
function test = myfun2(x)
test = x + a;
end
>>myfun(1)
Undefined function or variable 'a'.
什么事?我试图在myfun.m文件中使a
成为一个全局变量,但这并没有改变问题。我可以解决这个问题的唯一方法是,如果我在a
中包含myfun2
作为参数,这是我不想做的事情。
答案 0 :(得分:1)
MATLAB中的每个函数都有自己的局部范围(或MATLAB称之为工作空间),由您在该函数中定义的变量组成。该函数只能 查看这些变量和does not have access to variables stored within other functions or the base workspace。
你的a nested function has access to the workspace of the parent函数是正确的,这就是你的第一个例子的原因。但是,当您创建单独的m文件时,myfun2
不再是嵌套函数。它是一个独立的功能,它拥有独立的本地范围。
在函数的各个本地范围之间发送信息的唯一(推荐)方式是via input and output arguments to the functions。使用global variables is discouraged。
因此,对于这两个单独的m文件,您需要为myfun2
定义输入和输出参数,如下所示。
<强> myfun.m 强>
function test = myfun(x)
a = 1;
test = x + myfun2(x, a);
end
<强> myfun2.m 强>
function test = myfun2(x, a)
test = x + a;
end
然后您可以按预期调用myfun
。
>> myfun(1)
如果你真的必须使用全局变量,那么你需要定义需要访问它的全局变量within all workspaces。因此,您需要将global a
语句放在两个函数中。