matlab如何寫乙個類

2022-02-06 02:38:26 字數 4508 閱讀 6451

類是一種資料型別,與普通的資料型別不同的是類不僅包含資料,還包含對資料的操作,類把資料和資料操作方法封裝在一起,作為乙個整體參與程式的執行。類具有可繼承性,建立乙個新的類的時候,可以在乙個基類中新增成員派生出新類。類的變數和類的例項是不同的,類的例項是動態分配的記憶體區域,通常稱類的例項維「物件」,同乙個類可以有不同的例項存在,他們個子有自己的資料,但是資料操作方法是相同的。類的變數可以看作是乙個指標,指向類的例項。 

在matlab中,為了更好地進行資料的封裝,更加抽象地描述物件,也定義了類。

通常乙個類應該包含四個基本的成員函式:

建構函式 ―― 與類名相同,可以在其中完成成員初始化的工作;

顯示函式 ―― 名為display,用於顯示成員的資料;

賦值函式 ―― 名為set,用於設定類成員的數值;

取值函式 ―― 名為get,用於讀取類成員的函式。

與c++的類不同的是,matlab的類不需要特別的析構函式。如果類用到了一些特殊的內容需要釋放的話,可以編寫乙個成員函式,比如classclear,用包來釋放所占用的資源。

下面用乙個簡單的例子類介紹一些類如何使用

先看乙個matlab中的類**:

1

classdef tensiledata

2properties

3 material = 'carbon steel';

4 samplenumber = 0;

5stress

6strain

7end

8properties (dependent)

9modulus

10end

1112

methods

13function td =tensiledata(material,samplenum,stress,strain)

14if nargin > 0

15 td.material =material;

16 td.samplenumber =samplenum;

17 td.stress =stress;

18 td.strain =strain;

19end

20 end %tensiledata

21end

2223

methods

24function obj =set.material(obj,material)

25if ~(strcmpi(material,'aluminum') ||...

26 strcmpi(material,'stainless steel') ||...

27 strcmpi(material,'carbon steel'))

28 error('material must be aluminum, stainless steel, or carbon steel')

29end

30 obj.material =material;

31 end % material set function

3233

function modulus =get.modulus(obj)

34 ind = find(obj.strain > 0); %find nonzero strain

35 modulus = mean(obj.stress(ind)./obj.strain(ind));

36 end % modulus get function

3738

function obj = set.modulus(obj,~)

39 fprintf('%s%d\n','modulus is: ',obj.modulus)

40 error('you cannot set modulus explicitly');

41end

4243

function

disp(td)

44 fprintf(1,'material: %s\nsample number: %g\nmodulus: %1.5g\n',...

45td.material,td.samplenumber,td.modulus);

46 end %disp

4748

function

plot(td,varargin)

49plot(td.strain,td.stress,varargin)

50 title(['stress/strain plot for sample ',num2str(td.samplenumber)])

51 xlabel('strain %')

52 ylabel('stress (psi)')

53 end %plot

54end

5556 methods (access = 'private') %access by class members only

57function m =calcmodulus(td)

58 % over-simplified calculation of elastic modulus

59 ind = find(td.strain > 0); %find nonzero strain

60 m = mean(td.stress(ind)./td.strain(ind));

61 end %calcmodulus

62end

63 end % classdef

在上述**中,

1

classdef tensiledata

2...

3 end

是定義乙個tensiledata類。**:

1

properties

2 material = 'carbon steel';

3 samplenumber = 0;

4stress

5strain

6 end

是定義這個類的屬性,也就是c++中類的成員變數。但是和c++不同的是,matlab中的類定義還有乙個比較特別的地方的,就是定義依賴屬性,如下述**:

1

properties (dependent)

2modulus

3 end

這表示modulus這個屬性是個依賴屬性,它的值是通過其他屬性計算得到的,其中dependent的預設屬性值為true。

它的值是通過下面函式實現的:

1 % modulus get function

2function modulus =get.modulus(obj)

3 ind = find(obj.strain > 0); %find nonzero strain

4 modulus = mean(obj.stress(ind)./obj.strain(ind));

5 end

類的方法(函式)的定義是以methods ... end的的形式出現的。如下面的類方法的定義:

1

methods

2function td =tensiledata(material,samplenum,stress,strain)

3if nargin > 0

4 td.material =material;

5 td.samplenumber =samplenum;

6 td.stress =stress;

7 td.strain =strain;

8end

9end

10 end

該函式塊定義了tensiledata建構函式方法。上述**中的最後乙個方法 methods (access = 'private')

中的access = 'private'表示該方法僅能被類本身訪問和修改,是個私有成員方法。其中屬性access又可分為

setaccess和getaccess,屬性值和access相同。

1

function

disp(td)

2 fprintf(1,'material: %s\nsample number: %g\nmodulus: %1.5g\n',...

3td.material,td.samplenumber,td.modulus);

4 end

就表示第二行和第三行是連在一起的。

**:

如何寫乙個Stack?

1.棧是陣列 2.先進後出 3.出棧 4.入棧 手寫乙個雙向鍊錶 棧 public class stackpopandpush public stackpopandpush int lens 返回元素個數 public intsize 返回陣列長度,容量,棧資料長 private intcapaci...

譯 不用 Class,如何寫乙個類

譯文出自 掘金翻譯計畫 譯者 emilyqirabbit 校對者 allenlongbaobao,sunhaokk python 的物件模型令人難以置信的強大 實際上,你可以重寫所有 物件 或者向任何人分發奇怪的物件,並讓他們像對待正常的物件的那樣接受它。python 的物件導向是 smalltal...

如何寫乙個鍊錶

有的時候,處於記憶體中的資料並不是連續的。那麼這時候,我們就需要在 資料結構中新增乙個屬性,這個屬性會記錄下面乙個資料的位址。有了這個位址之後,所有的資料就像一條鍊子一樣串起來了,那麼這個位址屬性就起到了穿線鏈結的作用。相比較普通的線性結構,鍊錶結構的優勢是什麼呢?我們可以總結一下 1 單個節點建立...