matlab 多文件编程,是否有可能在MATLAB中为每个文件定义多个函数,并从该文件外部访问它们?...
m文件(即主函數(shù) )中的第一個函數(shù)在調(diào)用m文件時被調(diào)用。 主函數(shù)不需要與m文件具有相同的名稱,但為了清晰起見,它應該是這樣 。 當function和文件名稱不同時,必須使用文件名稱來調(diào)用主函數(shù)。
m文件中的所有后續(xù)函數(shù)(稱為本地函數(shù) (或舊術(shù)語中的“子函數(shù)”))只能由該m文件中的主函數(shù)和其他本地函數(shù)調(diào)用。 其他m文件中的函數(shù)不能調(diào)用它們。
另外,還可以在其他函數(shù)中聲明函數(shù)。 這些被稱為嵌套函數(shù) ,只能從嵌套函數(shù)中調(diào)用。 他們也可以訪問嵌套函數(shù)中的variables,這使得它們非常有用,盡pipe稍微有些棘手。
更多的想法…
上面提到的正常函數(shù)范圍映射行為有很多方法,例如Jonas的答案中提到的將函數(shù)句柄作為輸出parameter passing。 但是,我不會build議把它作為一個這樣的技巧的習慣,因為有可能有更好的select來組織你的文件。
例如,假設(shè)您在m文件Am具有一個主函數(shù)A以及本地函數(shù)D , E和F 現(xiàn)在我們假設(shè)在m文件Bm和Cm中分別有兩個相關(guān)的函數(shù)B和C ,您也可以調(diào)用D , E和F 這里有一些選項:
把D , E和F分別放在各自的m文件中,允許其他函數(shù)調(diào)用它們。 缺點是這些函數(shù)的范圍很大,并不局限于A , B和C ,但好處是這很簡單。
用D , E和F創(chuàng)build一個defineMyFunctions m文件(就像Jonas的例子中的那樣)作為本地函數(shù)和一個簡單的返回函數(shù)句柄的主函數(shù)。 這允許你將D , E和F在同一個文件中,但是這些函數(shù)的作用域并沒有做任何事情,因為任何可以調(diào)用defineMyFunctions函數(shù)都可以調(diào)用它們。 你也必須擔心傳遞函數(shù)句柄作為參數(shù),以確保你有他們需要他們的地方。
將D , E和F復制到Bm和Cm作為本地function。 這將它們的使用范圍限制為A , B和C ,但由于在不同的地方有相同代碼的三個副本,所以更新和維護代碼是一場噩夢。
使用私人function ! 如果在同一個目錄中有A , B和C ,則可以創(chuàng)build一個名為private的子目錄,并在其中放置D , E和F ,每個都作為一個單獨的m文件。 這限制了它們的范圍,所以它們只能被上面的目錄(即A , B和C )中的函數(shù)調(diào)用,并將它們放在同一個地方(但仍然是不同的m文件):
myDirectory/ Am Bm Cm private/ Dm Em Fm
所有這些都超出了你的問題的范圍,可能比你需要的更詳細,但是我認為可能會考慮組織你所有m文件這個更普遍的問題。 ;)
一般來說,你的問題的答案是否定的,你不能為每個文件定義多個外部可見的函數(shù)。 不過,您可以將函數(shù)句柄返回給本地函數(shù),而且一個方便的方法是使它們成為結(jié)構(gòu)體的字段。 這里是一個例子:
function funs = makefuns funs.fun1=@fun1; funs.fun2=@fun2; end function y=fun1(x) y=x; end function z=fun2 z=1; end
這里是如何使用它:
>> myfuns = makefuns; >> myfuns.fun1(5) ans = 5 >> myfuns.fun2() ans = 1
在單個文件中具有多個可單獨訪問的函數(shù)的唯一方法是使用面向?qū)ο缶幊虂矶x靜態(tài)方法 。 你可以像myClass.static1() , myClass.static2()等那樣訪問函數(shù)。
OOPfunction從R2008a開始才正式得到支持,所以除非你想使用舊的,沒有l(wèi)ogging的OOP語法,否則你的答案是否定的,正如@gnovice所解釋的那樣 。
編輯
在外部可訪問的文件中定義多個函數(shù)的另一種方法是創(chuàng)build一個返回多個函數(shù)句柄的函數(shù) 。 換句話說,你可以把你的定義函數(shù)稱為[fun1,fun2,fun3]=defineMyFunctions ,之后你可以使用out1=fun1(inputs)等
我真的很喜歡SCFrench的回答 – 我想指出的是,它可以很容易地修改,以使用assignin函數(shù)直接導入到工作區(qū)的function。 (像這樣做讓我想起很多Python的“從ximport”的方式)
function message = makefuns assignin('base','fun1',@fun1); assignin('base','fun2',@fun2); message='Done importing functions to workspace'; end function y=fun1(x) y=x; end function z=fun2 z=1; end
然后這樣使用:
>> makefuns ans = Done importing functions to workspace >> fun1(123) ans = 123 >> fun2() ans = 1
沿著SCFrench的答案,但更多的C#風格的旋轉(zhuǎn)..
我會(經(jīng)常)做一個包含多個靜態(tài)方法的類。 例如:
classdef Statistics methods(Static) function val = MyMean(data) val = mean(data); end function val = MyStd(data) val = std(data); end end end
由于這些方法是靜態(tài)的,所以你不需要實例化類。 你調(diào)用的function如下:
data = 1:10; mean = Statistics.MyMean(data); std = Statistics.MyStd(data);
我使用Octave在一個.m文件中定義了多個函數(shù),然后使用.m文件中的命令,我需要使用該文件中的函數(shù):
source("mycode.m");
不知道這是否可用于Matlab。
octave:8> help source 'source' is a built-in function -- Built-in Function: source (FILE) Parse and execute the contents of FILE. This is equivalent to executing commands from a script file, but without requiring the file to be named `FILE.m'.
你也可以把一個主文件中的函數(shù)和主函數(shù)一起看起來像這樣:
function [varargout] = main( subfun, varargin ) [varargout{1:nargout}] = feval( subfun, varargin{:} ); % paste your subfunctions below .... function str=subfun1 str='hello'
然后調(diào)用subfun1將如下所示:str = main('subfun1')
從R2017b開始,這不是正式的可能。 相關(guān)文件指出:
程序文件可以包含多個function。 如果文件僅包含函數(shù)定義,則第一個函數(shù)是主函數(shù),并且是MATLAB與文件名關(guān)聯(lián)的函數(shù)。 遵循主函數(shù)或腳本代碼的函數(shù)稱為本地函數(shù)。 本地function只能在文件中使用。
但是,其他答案中提出的解決方法可以實現(xiàn)類似的function。
總結(jié)
以上是生活随笔為你收集整理的matlab 多文件编程,是否有可能在MATLAB中为每个文件定义多个函数,并从该文件外部访问它们?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想投影仪出现雪花状斑点是怎么回事?
- 下一篇: oracle11g日志原理,oracle