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