6.3.2 创建元胞数组

介绍性示例(另请参阅元胞数组的基本用法)演示了如何创建包含当前可用变量的元胞数组。然而,在许多情况下,创建一个元胞数组,然后用数据填充它是很有用的。

cell 函数返回给定大小的元胞数组,其中包含空矩阵。此函数类似于用于创建新数字数组的 zeros 函数。以下示例创建一个包含空矩阵的 2×2 元胞数组

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] );
size (c1)
     ⇒   ans =
         3   4   5

可以看出 size 函数也适用于元胞数组。其他描述对象大小的函数也是如此,例如 lengthnumelrowscolumns

 
C = cell (n)
C = cell (m, n)
C = cell (m, n, k, …)
C = cell ([m n …])

创建一个新的元胞数组对象。

如果使用单个标量整数参数调用,则返回一个 N×N 的方阵元胞数组。如果使用两个或多个标量整数参数或一个整数值向量调用,则返回一个具有给定维度的数组。

另请参阅: cellstr, mat2cell, num2cell, struct2cell.

作为创建空元胞数组然后填充它们的替代方案,可以使用 num2cellmat2cellcellslices 函数。

 
C = num2cell (A)
C = num2cell (A, dim)

将数字矩阵 A 转换为元胞数组。

当没有指定 dim 时,A 的每个元素成为输出 C 中的 1×1 元素。

如果定义了 dim,则 C 的各个元素包含 A 中沿着指定维度的所有元素。dim 也可以是维度的向量,并应用相同的规则。

例如

x = [1,2;3,4]
⇒ 
    1    2
    3    4

## each element of A becomes a 1x1 element of C
num2cell (x)
   ⇒ 
      {
        [1,1] =  1
        [2,1] =  3
        [1,2] =  2
        [2,2] =  4
      }
## all rows (dim 1) of A appear in each element of C
num2cell (x, 1)
   ⇒ 
      {
        [1,1] =
           1
           3
        [1,2] =
           2
           4
      }
## all columns (dim 2) of A appear in each element of C
num2cell (x, 2)
   ⇒ 
      {
        [1,1] =
           1   2
        [2,1] =
           3   4
      }
## all rows and cols appear in each element of C
## (hence, only 1 output)
num2cell (x, [1, 2])
   ⇒ 
      {
        [1,1] =
           1   2
           3   4
      }

另请参阅: mat2cell.

 
C = mat2cell (A, dim1, dim2, …, dimi, …, dimn)
C = mat2cell (A, rowdim)

将矩阵 A 转换为元胞数组 C

每个维度参数(dim1dim2 等)是一个整数向量,它指定如何将该维度的元素划分到输出 C 的新元素中。第 i 个维度的元素数量是 size (A, i)。由于 A 中的所有元素必须被划分,因此要求 sum (dimi) == size (A, i)。输出元胞数组 C 的大小是 numel(dim1) × numel(dim2) × … × numel(dimn)。

给定一个单一维度参数 rowdim,输出按指定划分为行。所有其他维度不作划分,因此所有列(dim 2)、页(dim 3)等都出现在每个输出元素中。

示例

x = reshape (1:12, [3, 4])'
⇒ 
    1    2    3
    4    5    6
    7    8    9
   10   11   12

## The 4 rows (dim1) are divided in to two cell elements
## with 2 rows each.
## The 3 cols (dim2) are divided in to three cell elements
## with 1 col each.
mat2cell (x, [2,2], [1,1,1])
⇒ 
{
  [1,1] =

     1
     4

  [2,1] =

      7
     10

  [1,2] =

     2
     5

  [2,2] =
      8
     11

  [1,3] =

     3
     6

  [2,3] =
      9
     12
}

## The 4 rows (dim1) are divided in to two cell elements
## with a 3/1 split.
## All columns appear in each output element.
mat2cell (x, [3,1])
⇒ 
{
  [1,1] =

     1   2   3
     4   5   6
     7   8   9

  [2,1] =

     10   11   12
}

另请参阅: num2cell, cell2mat.

 
sl = cellslices (x, lb, ub, dim)

给定一个数组 x,此函数从索引向量确定的数组中生成切片的元胞数组。lbub 分别用于下限和上限。

换句话说,它等效于以下代码:

n = length (lb);
sl = cell (1, n);
for i = 1:length (lb)
  sl{i} = x(:,...,lb(i):ub(i),...,:);
endfor

索引的位置由 dim 决定。如果未指定,则沿第一个非奇异维度进行切片。

另请参阅: cell2mat, cellindexmat, cellfun.


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4