逗點分隔序列(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, 44, 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);