標籤:

MATLAB腳本中的局部函數

All comments and opinions expressed on Zhihu are mine alone and do not necessarily reflect those of my employers, past or present.

本文內容所有內容僅代表本人觀點,和Mathworks無關

MATLAB語言值得關注的新功能系列:腳本的局部函數

MATLAB已有的對局部函數(Local Function)的支持包括:在函數中定義局部函數, 和在類定義定義局部函數:

局部函數存在的意義是:首先它是一個函數,它可以重用;其次它的作用域是局部的,也就是說,只有在函數或者類定義內部,它才是可見的。局部函數的優點是:我們不需要給個定義的函數都提供一個單獨的m文件,眾所周知。太多m文件會污染MATLAB的路徑空間,如果你同時使用幾個工具箱,很難保證m文件沒有重名,如果有重名,有時路徑的順序不同會導致對文件分派(Dispatch)的不同,可能會給計算帶來想不到的錯誤。

從R2016b開始,MATLAB開始支持在腳本中聲明和使用局部函數, 下面的腳本中,對函數fac的使用,實際調用的是script_fac中的局部函數

% script_fac.mn nfac(2)nfac(6)nnfunction result = fac(n)n if n == 1n result = 1;n elsen result = n*fac(n-1);n endnendn

在命令行中運行該腳本

>> script_facnans =n 2nans =n 720n

對於不使用Local Function的情況,完成上述的工作,我們需要兩個文件,一個腳本,一個函數, function in script帶來的便利顯而易見。

可以在腳本中定義函數,這是MATLAB在語言的易用性上的又一重要的改進。因為並不是要用MATLAB解決的問題都是大型的工程問題,對於小型的工作項目,我們有理由期望不需要花很多時間在文件的創建和管理上,如果所有相關的內容都能集中在一個文件中,這樣也方便查找和管理。

與函數局部函數,類局部函數規則一樣,腳本局部函數可以有多個,比如下面這個腳本計算組合中有兩個局部函數

% script_2.mncomb(6,3)nnfunction result = comb(n,k)n result = fac(n)/(fac(k)*fac(n-k));nendnnfunction result = fac(n)n if n==1n result =1 ;n elsen result = n*fac(n-1);n endn endn

局部函數有自己的函數工作空間:它無法訪問腳本中的變數,除非腳本把變數當做參數傳遞給它

+--------------------------------+n| % script_3_1.m | n| a = 1; t | a是腳本中的變數n| b = 2; t |n| foo(b); t | n| .. t |n| |n|+-----------------------------+ |n|| function foo( n) | |n|| ..... | |n|| | | foo內部無法直接訪問an|| | |n|+-----------------------------+ |n+--------------------------------+n

局部函數的使用同正常的函數無異,它可以有自己的persistent變數,比如下面的這個腳本,可以記錄自己被調用的次數:

% script_3_2.mns = sprintf(I am called %d timesn,getCount());ndisp(s);nnfunction result = getCount()n persistent c;n if isempty(c)n c = 1 ;n elsen c = c + 1;n endn result = c; n endn

如果MATLAB路徑上恰好有和局部函數同名的函數,在腳本中,MATLAB將把函數分派到局部函數上.

which + bar仍將返回MALTAB路徑上的bar.m

本篇介紹了一個近年來MATLAB語言值得關注的新功能之一:腳本的局部函數。綜上:

  • MATLAB 從R2016b開始支持腳本中定義局部函數

  • 定義局部函數的語法和普通函數一樣

  • 局部函數擁有自己的工作空間

  • 局部函數可以幫助我們更好的管理組織函數

推薦閱讀:

MATLAB 高級數據結構連載 2:金融時間序列Financial Time Series (Part B)
[MATLAB R2017a 搶鮮報道] : 自動駕駛工具箱(2)
MATLAB 高級數據結構連載 1:金融時間序列Financial Time Series (Part A)
[matDL框架開發直播:1]matDL概述和基本使用
【Matlab基礎】04. 自定義函數

TAG:MATLAB |