6.3.3 索引元胞数组

元胞数组的基本用法所示,可以使用 ‘{’ 和 ‘}’ 运算符从元胞数组中提取元素。如果要提取或访问仍然为元胞数组的子数组,则需要使用 ‘(’ 和 ‘)’ 运算符。以下示例说明了差异:

c = {"1", "2", "3"; "x", "y", "z"; "4", "5", "6"};
c{2,3}
     ⇒   ans = z

c(2,3)
     ⇒   ans =
        {
          [1,1] = z
        }

因此,使用 ‘{}’ 可以访问元胞数组的元素,而使用 ‘()’ 可以访问元胞数组的子数组。

使用 ‘(’ 和 ‘)’ 运算符时,元胞数组的索引方式与多维数组类似。例如,可以使用以下命令将元胞数组第一列和第三列的所有行设置为 0

c(:, [1, 3]) = {0}
     ⇒   =
        {
          [1,1] = 0
          [2,1] = 0
          [3,1] = 0
          [1,2] = 2
          [2,2] = y
          [3,2] = 5
          [1,3] = 0
          [2,3] = 0
          [3,3] = 0
        }

注意,上述内容也可以这样实现:

c(:, [1, 3]) = 0;

这里,标量 ‘0’ 会自动提升为元胞数组 ‘{0}’,然后赋值给 c 的子数组。

再给出一个使用 ‘()’ 索引元胞数组的示例,可以按以下命令交换元胞数组的第一行和第二行:

c = {1, 2, 3; 4, 5, 6};
c([1, 2], :) = c([2, 1], :)
     ⇒   =
        {
          [1,1] =  4
          [2,1] =  1
          [1,2] =  5
          [2,2] =  2
          [1,3] =  6
          [2,3] =  3
        }

使用 ‘{’ 和 ‘}’ 运算符访问元胞数组的多个元素将生成一个包含所有请求元素的逗号分隔列表(请参阅逗号分隔列表)。使用 ‘{’ 和 ‘}’ 运算符,上例中的前两行可以像这样交换回来:

[c{[1,2], :}] = deal (c{[2, 1], :})
     ⇒   =
        {
          [1,1] =  1
          [2,1] =  4
          [1,2] =  2
          [2,2] =  5
          [1,3] =  3
          [2,3] =  6
        }

对于结构数组和数值数组,空矩阵 ‘[]’ 可用于从元胞数组中删除元素:

x = {"1", "2"; "3", "4"};
x(1, :) = []
     ⇒   x =
        {
          [1,1] = 3
          [1,2] = 4
        }

以下示例显示了如何仅删除元胞数组元素的内容,而不删除它们所占用的空间:

x = {"1", "2"; "3", "4"};
x(1, :) = {[]}
⇒   x =
      {
        [1,1] = [](0x0)
        [2,1] = 3
        [1,2] = [](0x0)
        [2,2] = 4
      }

索引操作在元胞数组本身上进行,而不是在元胞数组内的对象上进行。相比之下,cellindexmat 将矩阵索引应用于每个元胞数组条目中的对象,并返回请求的值。

 
y = cellindexmat (x, varargin)

对元胞数组中的矩阵执行索引。

给定一个矩阵的元胞数组 x,此函数计算

Y = cell (size (X));
for i = 1:numel (X)
  Y{i} = X{i}(varargin{1}, varargin{2}, ..., varargin{N});
endfor

索引参数可以是标量(2)、数组([1, 3])、范围(1:3)或冒号运算符(":")。但是,索引关键字 end 不可用。

另请参阅: cellslicescellfun


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

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