MATLAB數據類型 — 結構體(struct)


前言

對於有C語言基礎的使用者,結構體這個詞你可能很熟悉。沒錯,MATALB編程中也有結構體。而且與C語言的結構體相比,它擁有更獨特的特性。

與元胞(cell)類型一樣,結構體也可以存儲任意類型的數據。當然,它們也存在許多不同點。最大的不同點是,結構體是以不同名字的字段作為存儲容器,每個字段都可以存儲任意類型的數據。此外,若要構建結構體數組,則要求每個結構體的字段數目和字段名字必須相同下面將講述結構體數組,單個結構體也視為1x1的結構體數組。

正文

1. 結構體數組的創建

  • 直接對結構體變量名.字段名賦值(字段的命名規則和變量一樣)
% 1x3的結構體數組(不明確指定位置,按水平方式排列)
s(1).name = 'LiSi'; s(1).gender = 'Male'; s(1).age = 18; s(1).test = {'hello', 1}; s(2).name = 'LiSi'; s(2).gender = 'female'; s(2).age = 20; s(2).test = s(1); s s1 = s(1) s2 = s(2)

代碼運行結果如下。可以看出字段可以存儲任意類型的數據,甚至是元胞數組和結構體。

  • 使用函數struct()創建
% 1x1的結構體數組
s1 = struct;            % 不含字段 s2 = struct('name', '李四', 'gender', 'male'); % 1x3的結構體數組 s3 = struct('name', {'張三', '李四'}, 'gender', 'male');  % 通過元胞數組,來創建多結構體的結構體數組 s3 s3_1 = s3(1) s3_2 = s3(2)

代碼運行結果如下。注:struct函數的字段參數不能重復。因此,若要創建多結構體的結構體數組,必須使用元胞數組。

2. 結構體數組的訪問

結構體數組的訪問很簡單。這里不展示代碼,以文字敘述。

  • 訪問結構體數組中某個結構體的某個字段

先對結構體數組進行索引,得到待訪問的結構體。再通過待訪問的結構體.字段名獲取該結構體的該字段的數據。此外,如果該字段的數據是一個數組,還可以對該數組進一步索引。

  • 訪問結構體數組中所有結構體的某個字段

直接通過結構體數組.字段名,結果相當於一個逗號間隔的式子:結構體1.字段名, 結構體2.字段名, 結構體3.字段名 ...

3. 結構體數組的拼接

結構體數組的拼接也很簡單,和其它類型的拼接是一樣的,這里不展示代碼,只敘述它要遵循的緯度規則。

  • 水平拼接

待拼接的結構體數組的行數相等。

  • 垂直拼接

待拼接的結構體數組的列數相等。

4. 動態添加結構體字段

MATALB支持動態添加結構體字段,這一特點在交互設計中常被使用。

% 動態添加結構體字段的一般語法:結構體名.(動態表達式) = 待賦值
% 這里要求“動態表達式”的返回值是字符數組或字符串

此外,MATALB版本的不同,對動態表達式的要求也略有不同。詳見官方幫助文檔

5. 結構體數組的操作函數

有很多函數可以作用於結構體數組,下面舉幾個常用函數的簡單用法。更多函數見結構體數組的官方幫助文檔

  • isfield(),判斷輸入的字段是否為輸入結構體數組的字段。
  • rmfield(),刪除結構體中的字段。
% 1x3的結構體數組
s = struct('name', {'張三', '李四', '王二麻子'}, 'gender', 'male', 'age', {18, 20, 'unknown'});

% 函數isfield()
fieldStatus = isfield(s, {'name', 'gender'})

% 函數rmfield()
s_new = rmfield(s, {'name', 'gender'})
s

代碼運行結果如下。


免責聲明!

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



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