建立巢狀陣列(Creating Cell Arrays)

在基本巢狀陣列中已經介紹過如何使用已存在的資料建立一個巢狀陣列,然而在某些形況下會需要先建立一個巢狀陣列,而其中的資料隨後才會指定,此時可以使用 cell() 函數先產生指定維度的巢狀陣列,此函數的功能類似 zeros() 函數,由 cell() 函數所產生的巢狀陣列其所有的元素皆為空陣列。例如:

c = cell(2,2)

輸出為

c =

{
  [1,1] = [](0x0)
  [2,1] = [](0x0)
  [1,2] = [](0x0)
  [2,2] = [](0x0)
}

巢狀陣列與一般陣列一樣可以是多維度的,cell() 函數可以接受任何個數的正整數來指定所產生巢狀陣列的維度,亦可使用向量來指定其維度,例如:

c1 = cell(3, 4, 5);
c2 = cell( [3, 4, 5] );

所產生的 c1c2 是相同的巢狀陣列,要查看其維度可用 size() 函數:

size(c1)

輸出為

ans =

   3   4   5

除了 size() 函數之外,一般查詢物件大小的函數都可使用於巢狀陣列上,例如:lengthnumelrows()columns()

cell (x)
cell (n, m)
cell ([n, m])
cell (n, m, p, ...)
cell ([n, m, p, ...])

cell(x) 會建立一個 xx 的巢狀陣列;cell(n, m)cell([n, m]) 會建立 nm 的巢狀陣列;cell(n, m, p, ...)cell([n, m, p, ...]) 會建立多維度的巢狀陣列。

若要將數值陣列轉換為巢狀陣列,可以使用 num2cell()mat2cell() 函數。

c = num2cell (m)
c = num2cell (m, dim)

num2cell(m, dim) 會將數值矩陣 m 轉換為巢狀陣列,若有設定 dim 參數,則所傳回的巢狀陣列 c 的第 dim 個維度會是 1,而 c 中的元素則會是向量,例如:

a = [1,2,3;4,5,6];

將矩陣 a 轉為巢狀陣列:

num2cell(a)

輸出為

ans =

{
  [1,1] =  1
  [2,1] =  4
  [1,2] =  2
  [2,2] =  5
  [1,3] =  3
  [2,3] =  6
}
num2cell(a, 1)

輸出為

ans =

{
  [1,1] =

     1
     4

  [1,2] =

     2
     5

  [1,3] =

     3
     6

}
num2cell(a, 2)

輸出為

ans =

{
  [1,1] =

     1   2   3

  [2,1] =

     4   5   6

}
b = mat2cell (a, m, n)
b = mat2cell (a, d1, d2, ...)
b = mat2cell (a, r)

mat2cell(a, m, n) 會將矩陣 a 轉換為巢狀陣列,參數 mn 是指定如何分割矩陣 a,例如:

a = [1, 2, 3, 4, 5; 6, 7, 8, 9, 10; 11, 12, 13, 14, 15];

將矩陣 a 以圖中所表示的方法分割後轉為巢狀陣列:

octave-data-containers-mat2cell

mat2cell(a, [1, 2], [2, 3])

輸出為

ans =

{
  [1,1] =

     1   2

  [2,1] =

      6    7
     11   12

  [1,2] =

     3   4   5

  [2,2] =

      8    9   10
     13   14   15

}

mat2cell(a, m, n)m 的總和必須等於矩陣 a 的第一個維度,n 的總和必須等於矩陣 a 的第二個維度,更高維度的情況以此類推。

若只指定一個維度 r,則其餘的維度會被設定為 a 的維度,即第 i 個維度設為 size(a, i),例如:

mat2cell(a, [1, 2])

輸出為

ans =

{
  [1,1] =

     1   2   3   4   5

  [2,1] =

      6    7    8    9   10
     11   12   13   14   15

}