字串巢狀陣列(Cell Arrays of Strings)
巢狀陣列常用於儲存多個字串,字元陣列亦可一次儲存多個字串,但其每個字串的長度必須相等,而巢狀陣列則沒有這樣的限制,因此在儲存多個不同長度的字串時,建議使用巢狀陣列。在某些情況下在運算時會需要以字元陣列來儲存字串,Octave 中提供了一些函數可以將資料在巢狀陣列與字元陣列之間轉換:char() 與 strvcat() 函數可以將巢狀陣列轉換為字元陣列(請參考連接字串),而 cellstr() 函數可以將字元陣列轉換為巢狀陣列,例如:
a = ["hello"; "world"]; c = cellstr (a)
輸出為
c =
{
[1,1] = hello
[2,1] = world
}
cellstr (string)
cellstr(string) 函數會將字串陣列 string 轉換為巢狀陣列。
在 Octave 中大部分的字串操作函數都支援字串巢狀陣列,因此使用巢狀陣列的另外一個優點就是可以直接套用這些字串操作函數,例如可以使用 strcmp() 函數輸入字串巢狀陣列一次比較多個字串:
c = {"hello", "world"};
strcmp ("hello", c)
strcmp() 函數的參數中若有一個是字串巢狀陣列時,其會將巢狀陣列中的每一個字串與另外一個字串做比較,輸出為
ans = 1 0
以下的字串操作函數都支援巢狀陣列:char()、 strvcat()、 strcat() (請參考連接字串)、 strcmp()、 strncmp()、 strcmpi()、 strncmpi() (請參考字串比較)、 str2double()、 strtrim()、 strtrunc()、 strfind()、 strmatch()、 regexp()、 regexpi() (請參考字串操作)與 str2double() (請參考字串轉換)。
iscellstr (cell)
iscellstr(cell) 函數可以判斷巢狀陣列 cell 中所有的元素是否都是字串。
[idxvec, errmsg] = cellidx (listvar, strlist)
cellidx(listvar, strlist) 函數會傳回 strlist 中所有的字串在 listvar 中的位置索引,第一個傳回值 idxvec 是 listvar 的索引向量,若 strlist 中所列的字串不在 listvar 之中,則會將錯誤訊息傳回至第二個參數 errmsg 中,若只有指定一個輸出參數,則會將錯誤訊息輸出至螢幕上,並離開程式。例如:
a = {"ABC", "123", "abc", "456", "DEF"};
b = {"123", "456"};
cellidx(a, b)
輸出為
ans = 2 4
strlist 與 listvar 兩個參數都可以指定為字元陣列,若指定為字元陣列則每個字串在搜尋前會先以 deblank() 函數將多餘的空白去除。