在結構陣列中,我們可以使用「句點」(”.”)來存取某一筆資料內的某一個特定欄位值,例如 student(2).name 就是第二位學生的姓名,student(3).scores(2) 就是第三位學生的第二次小考成績,依此類推。請看下列範例:
如果欄位名稱是一個變數,我們同樣也可以使用句點來取得相關的欄位值,在下列範例中,我們使用一個變數 fieldName 來定義欄位,並列印此欄位的值,範例如下:
MATLAB 提供了 cat 指令,以達到「並排欄位值」的目的,其語法為:
A = cat(dim, structureField)
其中,dim 代表並排後所改變的維度。例如
- 欲將小考成績上下(垂直)並排,可輸入 cat(1, student.scores),此時被改變的維度是第一維。
- 欲將小考成績左右(水平)並排,可輸入 cat(2, student.scores),此時被改變的維度是第二維。
範例如下:
在進行「並排」時,必須確認被並排的欄位值有相同的行數(上下並排)或列數(左右並排),否則就會因為維度不和而產生錯誤訊息。例如,欲將 student 變數的 name 欄位進行上下並排,就會發生錯誤,請試試看:cat(1, student.name)。
依照上例,我們就可以很快地計算平均分數,如下:
由於「並排運算」常被用到,所以 MATLAB 又提供下列兩種方法來進行欄位值的並排:
- 方括弧運算:可以左右合併結構陣列中相同欄位的數值矩陣,產生一個新的數值矩陣。
- 大括弧運算:可以左右合併結構陣列中相同欄位的字串資料,產生一個異值矩陣。
範例如下:
上述的 cat 指令及方括弧、大括弧運算等都是 MATLAB 的內建指令,其運算速度很快。但若您要求的運算無法使用上述指令來達成,只好就使用速度較慢的 for 迴圈了!舉例來說,若要印出每位學生的名字,可輸入如下:
除此之外,亦可用 getfield 及 setfield 來取得及改變一個欄位的資料,其指令使用格式如下:
fieldValues = getfield(structureArray, {arrayIndex}, field, {fieldIndex})
newStructure = setfield(structureArray, {arrayIndex}, field,{fieldIndex})
例如,若欲取得第二位學生的第一次小考成績,下列兩種寫法都可以:
- score3 = getfield(student, {2}, 'scores', {1});
- score3 = student(2).scores(1);
若欲將第二位學生的第一次小考成績改為 100 分,下列兩種寫法也都可以:
- student = setfield(student, {2}, 'scores', {1}, 100);
- student(2).scores(1)=100;
若欲一次設定多個欄位值,可用 deal 指令,例如:
欲取用結構陣列中所有元素內所有欄位的資料,可用 struct2cell 指令,例如:
請注意在上例中,傳回的 values 是一個異質陣列,在本書的前一章有相關的介紹。一般而言,若輸入 struct2cell 指令的結構變數維度為 m×n,且包含 p 個欄位,則傳回異質陣列的維度為 p×m×n。(在上例中,p = 2,m = 1, n = 3。)
MATLAB程式設計:入門篇