結構操作(Manipulating Structures)

這裡列出一些用於操作資料結構欄位的函數。

rmfield (s, f)

rmfield(s, f) 函數會將資料結構 s 中的 f 欄位刪除,若 f 為字串的巢狀陣列或字元矩陣,則會將對應的欄位刪除。例如:

s = struct ("field1", 1, "field2", 2, "field3", 3, "field4", 4);
s2 = rmfield(s, ["field1"; "field3"])

輸出為

s2 =
{
  field2 =  2
  field4 =  4
}
[k1, ..., v1] = setfield (s, k1, v1, ...)

setfield(s, k1, v1) 會將資料結構 s 中欄位 k1 的值指定為 v1,並傳回新的資料結構。若欄位 k1 不存在,則會自動新增此欄位,例如:

s = struct ("field1", 1, "field2", 2);
s2 = setfield(s, "new_field", "new")

輸出為

s2 =
{
  field1 =  1
  field2 =  2
  new_field = new
}

其功用相當於:

s = struct("field1", 1, "field2", 2);
s2 = s;
s2.new_field = "new"

若是多層次的資料結構,則依序將欄位與索引填入參數中,例如:

sa(1, 1).f0 = 1;
sa2 = setfield (sa, {1, 2}, "fd", {3}, "b", 6);

其功用相當於:

sa(1, 1).f0 = 1;
sa2 = sa;
sa2(1, 2).fd(3).b = 6;

亦可使用另一種寫法:

sa(1, 1).f0 = 1;
sa2 = sa;
i1 = {1,2}; i2 = "fd"; i3 = {3}; i4 = "b";
sa2(i1{:}).(i2)(i3{:}).(i4) = 6;
[t, p] = orderfields (s1, s2)

orderfields(s1, s2)

函數會將資料結構 s1 的欄位依照 s2 所指定的順序排序後,傳回新的資料結構,若省略 s2 則會以字母的順序排序。參數 s2 可以是資料結構、字串的巢狀陣列或是排序向量。例如:

s1 = struct ("f1", 1, "f2", 2, "f3", 3, "f4", 4);
s2 = struct ("f4", 40, "f1", 10, "f2", 20, "f3", 30);

s1s2 的順序排序:

orderfields(s1, s2)

輸出為

ans =
{
  f4 =  4
  f1 =  1
  f2 =  2
  f3 =  3
}

以字串的巢狀陣列指定排序方式:

orderfields(s1, {"f2", "f3", "f4", "f1"})

輸出為

ans =
{
  f2 =  2
  f3 =  3
  f4 =  4
  f1 =  1
}

以排序向量指定排序方式:

orderfields(s1, [3, 1, 4, 2])

輸出為

ans =
{
  f3 =  3
  f1 =  1
  f4 =  4
  f2 =  2
}
fieldnames (struct)

fieldnames(struct) 函數會傳回資料結構 struct 的所有欄位名稱。若指定的 struct 不是資料結構,則會產生錯誤。例如:

s = struct ("f1", 1, "f2", 2, "f3", 3, "f4", 4);
fieldnames(s)

輸出為

ans =

{
  [1,1] = f1
  [2,1] = f2
  [3,1] = f3
  [4,1] = f4
}
isfield (expr, name)

isfield(expr, name) 函數會測試資料結構 expr 中是否包含名稱為 name 的欄位,參數 expr 為資料結構,而 name 為字串。例如:

s = struct ("f1", 1, "f2", 2, "f3", 3, "f4", 4);
isfield(s, "f2")

輸出為

ans =  1
[v1, ...] = getfield (s, key, ...)

getfield(s, key, ...) 函數會取出資料結構 s 中指定欄位的資料,例如:

s = struct ("f1", 1, "f2", 2, "f3", 3, "f4", 4);
getfield(s, "f3")

輸出為

ans =  3

多層次的資料結構:

ss(1,2).fd(3).b = 5;
getfield (ss, {1,2}, "fd", {3}, "b")

輸出為

ans =  5

亦可使用另一種寫法:

i1 = {1,2}; i2 = "fd"; i3 = {3}; i4= "b";
ss(i1{:}).(i2)(i3{:}).(i4)
substruct (type, subs, ...)

substruct() 函數會建立一個 subscript structure,用於 subsref()subsasgn() 函數。