Matlab面向對象編程基礎


DeepLab是一款基於Matlab面向對象編程的深度學習工具箱,所以了解Matlab面向對象編程的特點是必要的。筆者在做Matlab面向對象編程的時候發現無論是互聯網上還是書店里賣的各式Matlab編程書上都對Matlab面向對象所提甚少甚至沒提。因此在DeepLab的使用說明書中專門添加Matlab面向對象編程基礎是有必要的。
第一節 Matlab面向對象大體結構
代碼清單2.1.1

classdef className<handle & superclass1 & superclass2
    properties
        property1;
        property2;
    end
    methods
        function F1 = Func1(class_obj,parameter1)
            ...
        end
        function class_obj = Func2(class_obj)
            ...
        end
    end
    methods(Static)
        function display(class_obj)
            disp(class_obj.property1);
            disp(class_obj.property2);
        end
    end
end

解釋:在這段代碼中,classdef關鍵字后給出了類名,className<handle說明handle是className類的父類(繼承性),className可以使用handlle類中除指明privacy(類的私有屬性,只允許該類的函數或變量訪問)的所有函數。className可以從多個父類中繼承(多態性),方法就是在多個父類名間加入‘&’。如果一個類沒有父類,則classdef后接類名后什么都不用寫。properties關鍵字給出類的屬性。methods關鍵字給出類的方法(函數)。特別要注意的是,如果一個類有靜態方法,即該方法和具體的對象無關而是類所固有的方法,則該類函數應單獨寫入一個methods之內並在其后加上(Static)。
第二節 如何調用methods中的函數
代碼清單2.2.1

obj = className;
obj.Func1(parameter1);
obj.Func2;
className.display(obj);

解釋:這段代碼是基於在清單2.1.1中給出的類定義衍生的。第一句話用類className創造了一個實例obj。第二句話實例obj調用類中函數Func1,這里要注意雖然在Func1的定義中有兩個參數,一個是class_obj,另一個是parameter1,但是在調用的時候僅寫parameter1就足夠了,class_obj是系統自動傳入的。如果參數調用的時候寫class_obj則會報錯(錯誤提示:傳入過多參數)。同理,第三句話是Func2的調用,由於Func2是只有一個class_obj當參數,所以調用的時候直接省略所有的參數,連括號都省略了。當然與調用函數相對應,在寫函數的時候也要注意,無論是靜態methods還是普通methods,寫函數的參數都必須包括class_obj,否則,會提示一個錯誤(錯誤提示:未定義以‘double’型變量為參數的函數Func1)。帶按清單的最后一句話是className.display(obj),這里請注意,由於display是靜態methods,上文中我們提到過,靜態methods與對象無關而與類本身相關,所以調用靜態方法的主體是類,本例中就是className而不是實例化得obj。同時,請注意,與普通方法不同,靜態方法調用的時候必須傳入實例為參數。

第三節 如何將類聲明文件分布在多個文件中
與C++和Java相同,matlab在定義類中方法時,允許只在methods中聲明函數而將函數的實際文件及代碼單獨剝離成為另一個文件。這樣做的好處是可以使代碼簡單易懂。
Step1. 對於一個類,首先建立類文件包。方法時新建文件夾,然后更改文件夾名稱為@+類名。比如@className
Step2.在@className 文件中建立classdef類定義文件。比如代碼清單2.3.1
代碼清單2.3.1

classdef className<handle & superclass1 & superclass2
    properties
        property1;
        property2;
    end
    methods
        F1 = Func1(class_obj,parameter1);
        class_obj = Func2(class_obj);
        value = Func3(class_obj);
    end
    methods(Static)
        display(class_obj);
    end
end

可以看到methods中只包含方法的函數聲明及返回值而不包括函數的具體定義。然我們看看函數的具體定義怎么寫。
Step1. 在@className 文件中建立新的m文件,內容如清單2.3.2所示
代碼清單2.3.2

function F1 = Func1(class_obj,parameter1)
  F1 = class_obj.Func3+parameter1;
end

可以看到,這與普通的m文件沒有任何區別。但是需要注意的是,該函數Func1中,實際上又調用了類中的另一個函數Func3。而Func3在類中事先已經聲明過了。如果在類文件@className中直接建立一個m文件作為函數,而在classdef中的methods中不聲明,則Func1在調用的時候無法看到該函數。所以請注意:所有被對象調用的函數以及不被對象調用而被對象的函數調用函數,除matlab內建函數(sqrt,pow,length等等),必須在類中予以聲明才能使用,否則必會報錯。
在經歷上述步驟后,一個類就算定義完成了。但是仍然要注意,如果你想象在代碼清單2.2.1中建立並使用自己的對象。則必須退出@className文件,在@className的上一級文件中才能使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM