前言
對於有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
代碼運行結果如下。