在 Octave 中提供兩種方式可以將多種不同的資料儲存在同一個變數中,一種是類似 C 語言的資料結構(data structure),資料結構中的元素都有對應的名稱;另一種是巢狀陣列(cell array),巢狀陣列中可以包含任意類型與各種維度的資料。而函數的參數與傳回值是以逗點分隔序列(comma separated list)來儲存與傳遞。

資料結構(Data Structures)

Octave 中可以使用資料結構(data structure)將不同的資料儲存在一個變數中,使用上的語法非常類似 C 語言中的結構(structure)。目前其內部是以關聯性陣列的方式實做,而索引限定為字串。

基本用法與範例(Basic Usage and Examples)

資料結構中的欄位可以儲存各種類型的資料,而變數與其欄位名稱中間以句點連接,例如:

x.a = 1;
x.b = [1, 2; 3, 4];
x.c = "string";

這樣會建立一個包含三個欄位的資料結構 x,而 x 中的欄位 a 儲存一個純量,其值為 1,另外兩個欄位 b 與 c 分別為矩陣與字串。若要查看其中的資料,可以像一般的變數一樣輸入其變數名稱:

x

輸出為

x =
{
  a =  1
  b =

     1   2
     3   4

  c = string
}
Octave 在輸出資料結構時,其欄位的順序是不固定的。

資料結構中的欄位也可以指定為另一個資料結構,例如指定 x.d 為另一個資料結構:

x.d.d1 = 3;
x.d.d2 = [1, 2];
x.d

輸出為

ans =
{
  d1 =  3
  d2 =

     1   2

}

這時的 x 包含了另一個資料結構:

x

輸出為

x =
{
  a =  1
  b =

     1   2
     3   4

  c = string
  d =
  {
    d1 =  3
    d2 =

       1   2

  }

}

當 Octave 在輸出資料結構中又有包含其他的資料結構時,只會輸出最上面的幾層,例如:

a.b.c.d.e = 1;
a

輸出為

a =
{
  b =
  {
    c =
    {
      1x1 struct array containing the fields:

        d: 1x1 struct
    }

  }

}

限制輸出層數的原因是為了避免產生太長而難以閱讀輸出格式,輸出的層數可以使用 struct_levels_to_print() 函數設定。

val = struct_levels_to_print ()
old_val = struct_levels_to_print (new_val)

設定資料結構的輸出層數上限。

函數的傳回值類型也可以是資料結構,例如:

function y = f (x)
    y.re = real (x);
    y.im = imag (x);
endfunction

此函數 f(x) 會將輸入的複數純量或矩陣分開成實部與虛部分別儲存在兩個資料結構的欄位中,並傳回之,例如:

f([1+2i, 2+10i])

輸出為

ans =
{
  re =

     1   2

  im =

      2   10

}

函數的傳回值若是逗點分隔序列,也可以使用資料結構儲存,其使用方式就像一般變數一樣:

[ result.u, result.s(2:3,2:3), result.v ] = svd ([1, 2; 3, 4]);
result

輸出為

result =
{
  u =

    -0.40455  -0.91451
    -0.91451   0.40455

  s =

     0.00000   0.00000   0.00000
     0.00000   5.46499   0.00000
     0.00000   0.00000   0.36597

  v =

    -0.57605   0.81742
    -0.81742  -0.57605

}

資料結構中的欄位亦可以使用 for 迴圈依序存取,請參考條件控制(Statements)。