具有单独的.mfiles错误的嵌套函数

时间:2016-03-10 02:59:09

标签: matlab function nested

我正在尝试理解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.

但是,如果我将myfunmyfun2分成单独的.m文件,我会收到错误消息。例如

myfun.m

function test = myfun(x)

a = 1;

test = x + myfun2(x);

end

myfun2.m

function test = myfun2(x)

test = x + a;

end

>>myfun(1)
Undefined function or variable 'a'.

什么事?我试图在myfun.m文件中使a成为一个全局变量,但这并没有改变问题。我可以解决这个问题的唯一方法是,如果我在a中包含myfun2作为参数,这是我不想做的事情。

1 个答案:

答案 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语句放在两个函数中。