2010-04-30 92 views
47

我的實驗室裏有很多MATLAB代碼。問題是沒有辦法來組織它。由於所有函數都必須位於同一個文件夾中(或者你必須在MATLAB的path環境變量中添加一堆文件夾),所以我們註定要在同一個文件夾中加載多個文件,全局命名空間。有沒有更好的方法來組織我們的文件和功能?我真的希望有某種模塊系統...MATLAB最接近命名空間的是什麼?

+1

另請參見http://stackoverflow.com/questions/2326609/how-to-organize-matlab-code – 2010-05-01 00:38:15

回答

64

MATLAB有一個可以嵌套的包的概念,包括類和函數。

只要在+的第一個字符(如+mypkg)的路徑上的某個地方製作目錄。然後,如果該目錄中存在類別或功能,則可以將其稱爲mypkg.mything。您也可以使用import mypkg.mysubpkg.*從包中導入。

關於將一堆函數移動到一個包中的一個主要問題是函數和類不會自動導入它們所在的包,它們的編號爲。這意味着如果你有一堆函數在不同的m文件中互相調用,你可能不得不花費一些時間在函數調用中調用import。不要忘記把導入到子功能,並呼籲。更多信息:

http://www.mathworks.com/help/matlab/matlab_oop/scoping-classes-with-packages.html

+8

哦。我的。天哪。爲什麼沒有人告訴我這件事?謝謝! – rlbond 2010-05-01 06:50:04

+1

爲了回答這個原因,這是因爲有很多人使用老版本的MATLAB,而這只是新版本的一個特性。 – 2010-07-29 02:18:27

+0

什麼是具有此功能的最老版本的matlab? – Memming 2012-08-02 15:54:13

8

我沒有看到必須添加一些文件夾到Matlab的搜索路徑的問題。我修改了startup.m,以便遞歸查找我的Matlab啓動目錄中的目錄,並將它們添加到路徑中(它也對所有內容運行svn update)。這樣,如果我改變目錄結構,Matlab仍然會在下次啓動它時看到所有的功能。否則,您可以查看面向對象的代碼,將所有方法存儲在@objectName文件夾中。但是,這可能會導致許多重寫代碼,通過更新路徑可以避免(如果將文件夾添加到File菜單的路徑中,甚至有一個按鈕add with subfolders),並執行一些移動代碼。

編輯

如果你想組織你的代碼,使一些功能只對那些直接調用這些功能可見(如果你不想重新寫於OOP),你將調用函數放在一個目錄中,並在該目錄中創建一個名爲private的子目錄。那裏的函數只對父目錄中的函數可見。如果您必須爲一部分代碼重載一些內置的Matlab函數,這非常有用。

+2

我的問題是,所有的功能都在全局命名空間,即沒有辦法調用函數' subfolder1 \ myFunc(1,2,3)' – rlbond 2010-05-01 00:57:06

+2

如果要隱藏全局名稱空間中的函數,可以使用'private'文件夾。請參閱編輯。 – Jonas 2010-05-01 01:58:33

6

另一種方式來組織&重用代碼使用MATLAB的面向對象的特性。每個對象通常位於一個以「@」開頭並具有該類內部文件的文件夾中。 (雖然較新的語法不需要在單個文件中定義的類)。使用類文件夾內的私人文件夾,matlab甚至支持私有類成員。 Matlab的new class notation功能比較全面,但即使是old syntax也很有用。

順便說一下,我的startup.m檢查了我做我的SVN簽出到一個衆所周知的位置,並將所有子文件夾自動添加到我的路徑。

5

包系統可能是最好的。我使用類系統(@ClassName文件夾),但我實際上編寫對象。如果你不這樣做,寫一堆靜態方法真是愚蠢。有一點可以幫助你將所有的matlab代碼放到一個不在matlab路徑中的文件夾中。然後,您可以選擇性地將所需的代碼添加到路徑中。

所以說你有兩個項目,存儲在「c:\ matlabcode \ foo」和「c」\ matlabcode \ bar「中,它們都使用存儲在」c:\ matlabcode \ common「中的通用代碼,一個函數「setupPaths.m」是這樣的:

function setupPaths(projectName) 
basedir = fullfile('c:', 'matlabcode'); 
addpath(genpath(fullfile(basedir, projectName))); 
switch (projectName) 
    case {'foo', 'bar'} 
     addpath(genpath(fullfile(basedir, 'common'))); 
end 

當然,你可以擴展這方面的一個明顯的擴展將包括在每個目錄下的文本文件,說什麼其他的目錄應該被添加到使用的路徑。功能在該目錄中

如果您共享代碼,另一個有用的事情是設置一個「用戶特定/ LabMember」目錄結構,其中您有不同的實驗室成員保存代碼他們正在努力。這樣,如果你需要它,你可以訪問他們的代碼,但是當他們寫一個和你自己的名字相同的函數時不會被破壞。

相關問題