結構的資料處理(Processing Data in Structures)

要處理資料結構中的資料,最簡單的方式就是使用 for 迴圈(請參考 for 敘述)。另外也可以使用 structfun() 函數達到類似的功能,此函數可以將指定的函數套用至資料結構中的每個元素。

structfun (func, s)
[a, b] = structfun (...)
structfun (..., "ErrorHandler", errfunc)
structfun (..., "UniformOutput", val)

structfun(func, s) 函數會將函數 func 套用至資料結構 s 中的每個元素,s 中的每個元素會個別傳入 func 函數中執行。func 可以接受各種函數的形式,包含 inline function、function handle 或函數名稱(字串)。例如:

s = struct("f1", 1, "f2", 2, "f3", 3);
structfun (@(x) x * 2 + 1, s)

這會將資料結構 s 中所有的值乘以 2 再加 1,輸出為

ans =

   3
   5
   7

若參數 "UniformOutput" 設定為 true,則 func 所指定的函數必須傳回一個純量,這些純量會被連接起來而產生一個陣列,若設為 false,則 structfun() 的輸出將會是一個與輸入資料結構 s 有相同欄位的資料結構,其中的值是將 s 中的元素經過 func 函數處理後,再放進輸出資料結構的對應欄位中,在這種情況下輸出的資料形態是沒有限制的。例如:

s.name1 = "John Smith";
s.name2 = "Jill Jones";
structfun (@(x) regexp (x, '(\w+)$', "matches"){1}, s, "UniformOutput", false)

輸出為

ans =
{
  name1 = Smith
  name2 = Jones
}

"ErrorHandler" 參數可以將其後方的 errfunc 設定為錯誤處理函數,當 func 函數產生錯誤時,就會呼叫這個函數,此函數的格式為:

function [...] = errfunc (se, ...)

其中傳入的參數 se 是一個資料結構,其包含的欄位有:"identifier""message""index",分別代表錯誤的代碼與訊息,以及錯誤發生的資料位置。

struct2cell (s)

struct2cell(s) 函數會將資料結構 s 轉為巢狀陣列(cell array),若 f 為資料結構 s 的欄位數,則轉換出來的巢狀陣列維度為 [f size(s)]。例如:

s = struct("f1", "abcd", "f2", "1234");
struct2cell(s)

輸出為

ans =

{
  [1,1] = abcd
  [2,1] = 1234
}