matlab 多文件编程,是否有可能在MATLAB中为每个文件定义多个函数,并从该文件外部访问它们?...
m文件(即主函數 )中的第一個函數在調用m文件時被調用。 主函數不需要與m文件具有相同的名稱,但為了清晰起見,它應該是這樣 。 當function和文件名稱不同時,必須使用文件名稱來調用主函數。
m文件中的所有后續函數(稱為本地函數 (或舊術語中的“子函數”))只能由該m文件中的主函數和其他本地函數調用。 其他m文件中的函數不能調用它們。
另外,還可以在其他函數中聲明函數。 這些被稱為嵌套函數 ,只能從嵌套函數中調用。 他們也可以訪問嵌套函數中的variables,這使得它們非常有用,盡pipe稍微有些棘手。
更多的想法…
上面提到的正常函數范圍映射行為有很多方法,例如Jonas的答案中提到的將函數句柄作為輸出parameter passing。 但是,我不會build議把它作為一個這樣的技巧的習慣,因為有可能有更好的select來組織你的文件。
例如,假設您在m文件Am具有一個主函數A以及本地函數D , E和F 現在我們假設在m文件Bm和Cm中分別有兩個相關的函數B和C ,您也可以調用D , E和F 這里有一些選項:
把D , E和F分別放在各自的m文件中,允許其他函數調用它們。 缺點是這些函數的范圍很大,并不局限于A , B和C ,但好處是這很簡單。
用D , E和F創build一個defineMyFunctions m文件(就像Jonas的例子中的那樣)作為本地函數和一個簡單的返回函數句柄的主函數。 這允許你將D , E和F在同一個文件中,但是這些函數的作用域并沒有做任何事情,因為任何可以調用defineMyFunctions函數都可以調用它們。 你也必須擔心傳遞函數句柄作為參數,以確保你有他們需要他們的地方。
將D , E和F復制到Bm和Cm作為本地function。 這將它們的使用范圍限制為A , B和C ,但由于在不同的地方有相同代碼的三個副本,所以更新和維護代碼是一場噩夢。
使用私人function ! 如果在同一個目錄中有A , B和C ,則可以創build一個名為private的子目錄,并在其中放置D , E和F ,每個都作為一個單獨的m文件。 這限制了它們的范圍,所以它們只能被上面的目錄(即A , B和C )中的函數調用,并將它們放在同一個地方(但仍然是不同的m文件):
myDirectory/ Am Bm Cm private/ Dm Em Fm
所有這些都超出了你的問題的范圍,可能比你需要的更詳細,但是我認為可能會考慮組織你所有m文件這個更普遍的問題。 ;)
一般來說,你的問題的答案是否定的,你不能為每個文件定義多個外部可見的函數。 不過,您可以將函數句柄返回給本地函數,而且一個方便的方法是使它們成為結構體的字段。 這里是一個例子:
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
在單個文件中具有多個可單獨訪問的函數的唯一方法是使用面向對象編程來定義靜態方法 。 你可以像myClass.static1() , myClass.static2()等那樣訪問函數。
OOPfunction從R2008a開始才正式得到支持,所以除非你想使用舊的,沒有logging的OOP語法,否則你的答案是否定的,正如@gnovice所解釋的那樣 。
編輯
在外部可訪問的文件中定義多個函數的另一種方法是創build一個返回多個函數句柄的函數 。 換句話說,你可以把你的定義函數稱為[fun1,fun2,fun3]=defineMyFunctions ,之后你可以使用out1=fun1(inputs)等
我真的很喜歡SCFrench的回答 – 我想指出的是,它可以很容易地修改,以使用assignin函數直接導入到工作區的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#風格的旋轉..
我會(經常)做一個包含多個靜態方法的類。 例如:
classdef Statistics methods(Static) function val = MyMean(data) val = mean(data); end function val = MyStd(data) val = std(data); end end end
由于這些方法是靜態的,所以你不需要實例化類。 你調用的function如下:
data = 1:10; mean = Statistics.MyMean(data); std = Statistics.MyStd(data);
我使用Octave在一個.m文件中定義了多個函數,然后使用.m文件中的命令,我需要使用該文件中的函數:
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'.
你也可以把一個主文件中的函數和主函數一起看起來像這樣:
function [varargout] = main( subfun, varargin ) [varargout{1:nargout}] = feval( subfun, varargin{:} ); % paste your subfunctions below .... function str=subfun1 str='hello'
然后調用subfun1將如下所示:str = main('subfun1')
從R2017b開始,這不是正式的可能。 相關文件指出:
程序文件可以包含多個function。 如果文件僅包含函數定義,則第一個函數是主函數,并且是MATLAB與文件名關聯的函數。 遵循主函數或腳本代碼的函數稱為本地函數。 本地function只能在文件中使用。
但是,其他答案中提出的解決方法可以實現類似的function。
總結
以上是生活随笔為你收集整理的matlab 多文件编程,是否有可能在MATLAB中为每个文件定义多个函数,并从该文件外部访问它们?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想投影仪出现雪花状斑点是怎么回事?
- 下一篇: apche 禁止运行php,学习猿地-a