結構的資料處理(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 }