日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

function函数嵌套 matlab_MATLAB嵌套函数

發布時間:2023/12/14 循环神经网络 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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嵌套函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。