逗點分隔序列(Comma Separated Lists)
逗點分隔序列(comma separated lists)是 Octave 函數的輸入與輸出參數的基本資料類型,例如:
max(a, b)
其中小括號中的 a, b
就是一個逗點分隔序列,逗點分隔序列可以使用在等號的左邊或右邊,例如:
x = [1 0 1 0 0 1 1; 0 0 0 0 0 0 7]; [i, j] = find (x, 2, "last");
其中等號右邊小括號中的 x, 2, "last"
是一個逗點分隔序列組成的輸入參數,而 find()
函數也會傳回一個逗點分隔序列,並將其中的每個元素分別指定給等號左邊逗點分隔序列中的元素 i, j
。
逗點分隔序列另外一個常見的使用方式是在使用中括號([]
)建立矩陣,或使用大括號({}
)建立巢狀陣列時:
a = [1, 2, 3, 4]; c = {4, 5, 6, 7};
其中的 1, 2, 3, 4
與 4, 5, 6, 7
都是逗點分隔序列。
使用者無法直接操作逗點分隔序列,但可以將資料結構與巢狀陣列轉換為逗點分隔序列,這樣可以替代原本使用逗點分隔序列的地方,這種特性在某些形況很有用,在下面的教學中會示範這樣的用法。
由巢狀陣列產生逗點分隔序列(Comma Separated Lists Generated from Cell Arrays)
巢狀陣列可以使用大括號將指定元元素取出並組成逗點分隔序列(請參考巢狀陣列索引),而將此逗點分隔序列之外再加上中括號則可以轉換成陣列,例如:
a = {1, [2, 3], 4, 5, 6}; b = [a{1:4}]
輸出為
b = 1 2 3 4 5
使用大括號可以將逗點分隔序列轉換為巢狀陣列,例如將一個巢狀陣列中的元素取出建立一個新的巢狀陣列:
a = {1, rand(2, 2), "three"}; b = { a{ [1, 3] } }
輸出為
b = { [1,1] = 1 [1,2] = three }
另外,巢狀陣列使用大括號所取得的逗點分隔序列,可以直接做為函數的輸入參數,這等同於將每個元素分開傳入函數中。例如:
c = {"GNU", "Octave", "is", "Free", "Software"}; printf ("%s ", c{1}, c{2}, c{3}, c{4}, c{5});
輸出為
GNU Octave is Free Software
也可以使用另外一種寫法:
printf ("%s ", c{:});
輸出為
GNU Octave is Free Software
這兩種寫法是完全一樣的,為一的差異只有在於後者不用輸入那麼長的指令,並且可以處理任何長度的巢狀陣列 c
。
使用大括號所產生的逗點分隔序列若是放在等號的左邊,則可以有指定的功能,例如:
[result{1:2}] = find (2 * eye (2))
輸出為
result = { [1,1] = 1 2 [1,2] = 1 2 }
由結構陣列產生逗點分隔序列(Comma Separated Lists Generated from Structure Arrays)
結構陣列可以使用欄位名稱來產生逗點分隔序列,例如:
x = ceil (randn (10, 1)); in = struct ("call1", {x, 3, "last"}, "call2", {x, inf, "first"}); out = struct ("call1", cell (2, 1), "call2", cell (2, 1)); [out.call1] = find (in.call1); [out.call2] = find (in.call2);