2011-05-12 64 views
0

可能重複:
Is it possible to define more than one function per file in MATLAB?有沒有辦法從文件外部調用MATLAB的「子功能」?

爲了定義一個MATLAB(不是匿名的)功能,您需要創建具有相同的名稱作爲函數的文件;例如,一個函數調用MYFUNC可以在文件myfunc.m被定義爲每:

function rtn = myfunc(arg) 
% do some stuff 
end 

假設在同一個文件myfunc.m,我也有一個子功能,如

function rtn = myfunc(arg) 
% do some stuff 
end 

function rtn = mysubfunc(arg) 
% do some other stuff 
end 

據我所知,有沒有辦法從執行subfunc.m文件以外的任何地方發生訪問mysubfunc。在MATLAB(R2010b)中,我一直都很擔心這種小小的特質。我錯了 - 是否有任何方式來呼叫mysubfunc從外部myfunc.m

更新:新問題:有沒有什麼方法做到這一點?或者我應該真的把它吸了起來,並繼續製作更多文件?

+0

不,你必須把它吸起來。我使用半命名空間方法來減少混亂,並鼓勵我重用自己的代碼(例如,在'heatflux'項目中,我將使用hf_開始所有函數名稱)。 – Alex 2011-05-12 07:14:21

+0

這裏你的目標是什麼?你只是想減少在一個單獨的文件中的每個功能的混亂? – 2011-05-12 18:28:40

+0

如果您需要訪問myfunc之外的子函數,那麼幾乎按照定義,它不應該是子函數。子函數應該保留用於僅在封閉函數的上下文中相關的通用功能。 – Marc 2011-05-13 19:31:27

回答

9

你可以讓它們成爲工具類的所有靜態方法。這些函數可以通過名稱全局引用,但只需要管理一個M文件。

classdef mystuff % in mystuff.m 
    %MYSTUFF Utility functions for something or other... 
    methods (Static = true) 
     function rtn = myfunc(arg) 
     disp('myfunc'); 
     end 

     function rtn = mysubfunc(arg) 
     disp('mysubfunc'); 
     end 
    end 
end 

缺點是,您需要限定或導入對它們的所有引用,如mystuff.myfunc()。一個「import mystuff。*」可以爲班級以外的代碼處理這個問題。

import mystuff.* 
myfunc() 
mysubfunc() 

在該類中,函數之間的調用將需要進行限定。 (Matlab的MCOS語法中的大疣,恕我直言)。另外,它們比常規函數有更多的調用開銷,所以如果你在緊密循環中調用它們,你的代碼會變慢。好處是,現在他們是班級成員,並且可以重構他們以利用私人班級字段和功能等等。

如果你想組織你的代碼庫,你可以把它們放到一個名字以「+」開頭的目錄中。相同數量的文件,但至少您的目錄有一些結構。

+0

謝謝安德魯,這看起來像一個乾淨的解決方案。 – pariser 2011-05-13 21:53:11

1

通過功能手柄進行訪問。它可以看作是面向對象仿真(靜態方法)。我不建議你使用這種技術

function obj = mainFunc() 
obj.myFunc = @myFunc; 
obj.mySubFunc = @mySubFunc; 
end 

function rtn = myFunc(arg) 
% do some stuff 
end 

function rtn = mySubFunc(arg) 
% do some other stuff 
end 
+1

如你所示的「對象模擬」可能是一個壞主意;但總的來說,我認爲將函數句柄返回給子函數對於MATLAB來說是足夠合理的事情。 – Edric 2011-05-12 07:34:40

+0

如果你要去解決這個問題,就像上面Andrew所說的那樣,製作一個實用課程。 – Marc 2011-05-13 19:29:51

相關問題