function函数嵌套 matlab_MATLAB嵌套函数
嵌套函數的定義
嵌套函數,即nested function,就是嵌套在函數體內部的函數。嵌套函數可以出現在一個函數體內部的任何位置,開始以function聲明,結束的時候加上end。需要說明的是包含有嵌套函數的函數,無論它是主函數、子函數、嵌套函數,都應該在末尾的地方加上end。下面的代碼是一個簡單的嵌套函數的例子
例1
function r=MyTestNestedFun(input)
a=5;
c=sin(input)+tan(input);
function y=nestedfun(b)
y=a*c+b;
end
r=nestedfun(5);
end
>> r=MyTestNestedFun(6)
r =
2.1479
結果是這樣得到的:調用MyTestNestedFun后,程序依次執行a=5;c=sin(input)+tan(input);然后又調用nestedfun這個嵌套函數,此時b=5,而嵌套函數所在的函數中的a,c對嵌套函數是可見的。r=a*c+b=5*(-0.5704)+5=2.1479
嵌套函數種類
嵌套函數可以分為單重嵌套函數和多重嵌套函數。先說單重嵌套函數,這樣的函數嵌套在別的函數體內,自己內部不再有嵌套的函數。如上例示例。一個函數里可以有一個或者多個單重嵌套函數。
多重嵌套函數,這樣的函數嵌套在別的函數體內,同時自己內部又嵌套著別的另一層或幾層函數。同樣一個函數里可以有一個或者多個多重嵌套函數。如下
例2
function x=A(p1,p2)
...
function y1=B1(p3)
...
function z1=C1(p4)
...
end
...
end
...
function y2=B2(p5)
...
function z2=C2(p6)_
...
function w=D(p7)
...
end
end
end
end
該函數A(p1,p2)內部有兩個嵌套函數,分別B1(p3)和B2(p5),而B1(p3)和B2(p5)分別是二重和三重嵌套函數。
嵌套函數的變量作用域
例1
function r=NestedFunctionVarScopeDemo(a)
b=a+1;
function Nested1
c=b+1;
function Nested11
d=c+a;
end
Nested11;
end
Nested1
r=d;
end
運行上面的代碼,譬如
r=NestedFunctionVarScopeDemo(1)
r =
4
上述代碼有一個二重嵌套函數Nested1,它內部還包含一個嵌套函數Nested11,整個函數的執行過程如下:
傳入變量a=1,計算b的值,b=2;遇到Nested1的函數定義,往下是調用Nested1的語句,進入Nested1之后先計算c的值,即c等于b+1=3。從這里可以看到,在嵌套函數體內,可以訪問主函數之內的變量。“c=b+1;”這條語句之后是定義Nested11的函數語句,定義Nested11結束后,是調用Nested11的函數語句。從Nested11的定義來看,這個函數非常簡單,僅僅做的是計算d=c+a;從這里可以看出在第二重嵌套函數里,分別訪問了Nested1里的變量c和主函數里的變量a。主函數最后一句是從外部訪問了第二重嵌套函數里的變量d,并將d賦給r,以此作為主函數的返回值。
從上面這個嵌套函數的示例可以看出,主函數和嵌套在其內的函數,它們各自的變量是可以互相訪問的。但是必須要注意的是,嵌套函數訪問主函數的變量,可以在函數定義里直接拿過來用,而主函數訪問嵌套在其內的函數里的變量則必須要經過調用之后才能用。譬如上例主函數訪問Nested11里的d,是經過在主函數里調用Nested1,而在Nested1里又調用Nested11后才成功的,否則是不行的。
例2
function r=NestedFunctionVarScopeDemo2(a)
b=a+1;
function Nested1
c=b+1;
c1=10;
function Nested11
d=c+a;
end
end
Nested1
e=c1
r=d;
end
運行得到如下結果
r=NestedFunctionVarScopeDemo2(1)
e =
10
未定義函數或變量 'd'。
出錯 NestedFunctionVarScopeDemo2 (line 12)
r=d;
在調用NestedFunctionVarScopeDemo2時候發生了錯誤。從提示來看,是沒有定義變量“d”。這是因為調用Nested1后執行了Nested1里的語句,但是Nested1中只是定義了Nested11,而并沒有調用它的語句。因此,外界不能訪問d。這就是為什么e=c1;可以成功而r=d;報錯的原因了。
上面討論了嵌套函數和主函數之間變量互相訪問的情況(包括主函數也是嵌套函數的情況)。那么不同的嵌套函數之間呢?如下例
例3
function r=NestedFunctionVarScopeDemo3(a)
b=a+1;
function Nested1
c=b+1;
c1=10;
Nested2;
c2=d^2;
end
function Nested2
d=2*b;
end
Nested1
r=c2
end
該函數里面包含兩個嵌套函數,都是單重的,一個是Nested1,一個是Nested2。本例是想驗證,是否直接從Nested1中通過調用Nested2來訪問其中的變量。經過運行得到下面的結果:
>> r=NestedFunctionVarScopeDemo3(1)
未定義函數或變量 'd'。
出錯 NestedFunctionVarScopeDemo3/Nested1 (line 7)
c2=d^2;
出錯 NestedFunctionVarScopeDemo3 (line 12)
Nested1
從錯誤提示來看,出錯原因是訪問變量“d”不成功,“d”未定義,所以彼此沒有嵌套關系的嵌套函數是不能簡單得共享變量的,如果非要共享,只能通過他們所在的主函數來進行。
嵌套函數彼此調用關系
主函數和嵌套函數之間
這里的主函數包括最上層的主函數,即不嵌套在任何函數里的函數以及本身是嵌套函數,但同時內部還嵌套有其他函數的函數。因為這些函數相對嵌套在內的函數來說也是主函數。這樣的情形下,調用關系遵循下面的原則:
主函數可以調用嵌套在其中的第一重嵌套函數而不能調用第二重或者更深重的嵌套函數;無論第幾重嵌套函數,都可以調用主函數或者主函數的主函數等等
如下例
function r=NestedFunctionCallDemo1(a)
b=a+1;
function c1=Nested1(x)
c=b+1;
c1=10+c*x;
function d=Nested11
d=c+a;
end
end
c1=Nested1(1);
r=Nested11;
end
本例呈現的是主函數調用子函數的例子。又上例可以看出。在主函數NestedFunctionCallDemo1中分別對Nested1和Nested11進行了調用。運行結果如下:
r=NestedFunctionCallDemo1(1)
c1 =
13
未定義函數或變量 'Nested11'。
出錯 NestedFunctionCallDemo1 (line 11)
r=Nested11;
從結果來看,調用Nested1成功,而調用Nested11沒有成功。這驗證了主函數可以調用嵌套在其中的第一重嵌套函數,而不能調用第二重或者更深重的嵌套函數
下例為嵌套函數調用主函數的例子
function NestedFunctionCallDemo2(flag)
switch flag
case 1
disp('flag=1');
return;
case 2
disp('flag=2');
NestedFun1
case 3
disp('flag=3');
return
otherwise
disp(['flag=',num2str(flag)]);
return
end
function NestedFun1
NestedFunctionCallDemo2(1);
NestedFun2
function NestedFun2 NestedFunctionCallDemo2(3)
end
end
end
運行上述代碼,得到下面結果
>> NestedFunctionCallDemo2(2)
flag=2
flag=1
flag=3
當flag=2時,執行的是NestedFun1,而在NestedFun1中調用了主函數,這時候flag=1;因此此時顯示“flag=1”,接下來在NestedFun1中對NestedFun2進行了調用。而NestedFun2對最外層的主函數來說是一個二重嵌套函數,同樣它也調用了NestedFunctionCallDemo2,只不過flag=3,因此顯示“flag=3”。從上例可以看出,嵌套函數對主函數的調用是可以的。
不同的嵌套函數之間
這里討論的不用嵌套函數之間指的是嵌套深度相同或者不同,彼此之間沒有嵌套與被嵌套關系的不同的嵌套函數。譬如位于第一層的不同嵌套函數之間,以及位于第二層的不同嵌套函數之間,等等。如下例
嵌套函數調用示例1
function NestedFunctionCallDemo3
Nested1(5)
function Nested1(x)
disp(['Nested1 執行,輸入:',num2str(x)]);
Nested2(6)
function Nested11(xx)
disp(['Nested11 執行,輸入:',num2str(xx)]);
end
end
function Nested2(y)
disp(['Nested2 執行,輸入:',num2str(yy)]);
function Nested22(yy)
disp(['Nested22 執行,輸入:',num2str(yy)]);
end
end
end
運行結果如下:
Nested1 執行,輸入:5
Nested2 執行,輸入:6
從上面結果來看,Nested1執行后成功調用Nested2這說明第一層的嵌套函數之間是可以互相調用的。
嵌套函數調用示例2
function NestedFunctionCallDemo4
Nested1(5)
function Nested1(x)
disp(['Nested1 執行,輸入:',num2str(x)])
Nested11(6)
function Nested11(xx)
disp(['Nested11 執行,輸入:',num2str(xx)])
Nested2(pi)
Nested22(10);
end
end
function Nested2(y)
disp(['Nested2 執行,輸入:',num2str(y)])
Nested22(pi*pi)
function Nested22(yy)
disp(['Nested22 執行,輸入:',num2str(yy)])
end
end
end
運行代碼,得到
>> NestedFunctionCallDemo4
Nested1 執行,輸入:5
Nested11 執行,輸入:6
Nested2 執行,輸入:3.1416
Nested22 執行,輸入:9.8696
未定義函數或變量 'Nested22'。
出錯 NestedFunctionCallDemo4/Nested1/Nested11
(line 9)
Nested22(10);
出錯 NestedFunctionCallDemo4/Nested1 (line 5)
Nested11(6)
出錯 NestedFunctionCallDemo4 (line 2)
Nested1(5)
從上面的執行情況可以看出函數Nested11成功被調用,而且Nested11再調用Nested2時也成功了,通過Nested2,間接調用了Nested22,但是從Nested11中直接調用Nested22卻沒有成功。說明第二重調用可以調用不包含它的第一重嵌套函數。
嵌套函數調用3
function NestedFunctionCallDemo5
Nested1(5)
function Nested1(x)
disp(['Nested1 執行,輸入:',num2str(x)])
Nested11(6)
function Nested11(xx)
disp(['Nested11 執行,輸入:',num2str(xx)])
Nested111(pi)
function Nested111(xxx)
disp(['Nested111 執行,輸入:',num2str(xxx)]);
Nested2(exp(1))
Nested22(100)
end
end
end
function Nested2(y)
disp(['Nested2 執行,輸入:',num2str(y)])
Nested22(pi*pi)
function Nested22(yy)
disp(['Nested22 執行,輸入:',num2str(yy)])
end
end
end
運行代碼結果為:
Nested1 執行,輸入:5
Nested11 執行,輸入:6
Nested111 執行,輸入:3.1416
Nested2 執行,輸入:2.7183
Nested22 執行,輸入:9.8696
未定義函數或變量 'Nested22'。
出錯
NestedFunctionCallDemo5/Nested1/Nested11/Nested111
(line 12)
Nested22(100)
出錯 NestedFunctionCallDemo5/Nested1/Nested11
(line 8)
Nested111(pi)
出錯 NestedFunctionCallDemo5/Nested1 (line 5)
Nested11(6)
出錯 NestedFunctionCallDemo5 (line 2)
Nested1(5)
從上面的執行情況可以看出,函數Nested1執行后,函數Nested11成功被調用,而且Nested11在調用Nested111,Nested111在調用Nested2時也成功了;通過Nested2,Nested111間接調用了Nested22,但是從Nested111直接調用Nested22卻沒有成功。這說明第三重嵌套函數,不可以調用不包含它的第二重嵌套函數。
嵌套函數調用關系總結
為了方便理解。可以將上述調用情況進行類比
具體如下
將主函數看成“父親”,嵌套函數依據嵌套深度可以看成“兒子”,“孫子”,“重孫子”,等等。
父親可以求助兒子,兒子可以求助父親。即父子可以互相求助。一個人不能求助孫子,重孫等后代,但是可以求助自己的祖宗(祖父、曾祖父等等)。一個人可以求助自己親兄弟,或者叔叔、伯伯但不能求助侄兒
總結
以上是生活随笔為你收集整理的function函数嵌套 matlab_MATLAB嵌套函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【pytorch torchvision
- 下一篇: 应用matlab仿真几类混沌电路,典型混