首页 > 编程笔记 > MATLAB笔记 阅读:56

MATLAB元胞数组的用法(非常详细,附带实例)

在 MATLAB 中,元胞(Cell)数组是一种无所不包的广义矩阵。

组成元胞数组的每个元素称为一个单元。每个单元可以包括一个任意数组,如数值数组、字符串数组、结构体数组或另外一个元胞数组,因而每个单元可以具有不同的尺寸和内存占用空间。

与一般的数值数组一样,元胞数组的维数不受限制,可以为一维、二维或多维。

MATLAB 中使用元胞数组的目的在于,它可以把不同类型的数据归并到一个数组中。

MATLAB元胞数组的创建

元胞数组的创建有两种方法:使用赋值语句创建元胞数组和利用 cell() 函数创建空元胞数组。

1) 使用赋值语句创建元胞数组

与一般数组不同的是,元胞数组使用花括号“{}”来创建,使用逗号“,”或空格来分隔每个单元,使用分号“;”来分行。

【实例】创建元胞数组。
在命令行窗口中输入以下语句,并显示相应的输出结果。
>> clear
>> C = {'x', [1; 3; 6]; 10, pi}
C =
    2x2 cell 数组
    {'x' }    {3x1 double}
    {[10] }   {[ 3.1416]}

>> whos C
  Name      Size            Bytes  Class      Attributes

  C         2x2             458     cell

2) 利用cell()函数创建空元胞数组

cell() 函数的调用格式如下:
cellName = cell(m,n)
该函数创建一个 m×n 的空元胞数组,每个单元均为空矩阵。

【实例】创建空元胞数组。
在命令行窗口中输入以下语句,并显示相应的输出结果:
>> clear
>> a = cell(2,2)
a =
    2x2 cell 数组
    {0x0 double}    {0x0 double}
    {0x0 double}    {0x0 double}

>> b = cell(1)
b =
    1x1 cell 数组
    {0x0 double}

>> whos
  Name   Size      Bytes   Class    Attributes

  a      2x2        32     cell
  b      1x1         8     cell
与一般的数值数组一样,元胞数组的内存空间也是动态分配的。因此,使用 cell() 函数创建空元胞数组的主要目的是为该元胞数组预先分配连续的存储空间,以节约内存,提高执行效率。

元胞数组的寻访

在元胞数组中,单元和单元中的内容是两个不同范畴的东西,因此,寻访单元和单元中的内容是两种不同的操作。

MATLAB 为上述两种操作设计了相对应的操作对象:单元外标识(Cell Indexing)和单元内编址(Content Addressing)。

对于元胞数组 C,C(m, n) 指的是元胞数组中第 m 行第 n 列的单元,而 C{m, n} 指的是元胞数组中第 m 行第 n 列单元中的内容。

【实例】元胞数组的寻访。
在命令行窗口中输入以下语句,并显示相应的输出结果。
>> clear         % 清除工作区变量
>> C = {3, [4 7; 6 6; 80 9], 'string'; sin(pi/8), 3>10, 'code'} % 创建一个包含不同类型元素的元胞数组
C =
    2x3 cell 数组
    {[ 3]}    {3x2 double}    {'string'}
    {[0.3827]} {[ 0]}         {'code'}

>> unitVal_1 = C(2,2)  % 访问 C 第 2 行第 2 列的元素,并返回一个包含该元素的元胞数组
unitVal_1 =
    1x1 cell 数组
    {[0]}

>> class(unitVal_1)    % 返回 unitVal_1 的数据类型
ans =
    'cell'

>> unitVal_2 = C{2,2}  % 访问 C 第 2 行第 2 列的元素,并返回该元素的值
unitVal_2 =
    logical
    0

>> class(unitVal_2)    % 返回 unitVal_2 的数据类型
ans =
    'logical'

元胞数组的操作

元胞数组的操作包括合并/删除元胞数组中的指定单元、改变元胞数组的形状等。

1) 元胞数组的合并

【实例】元胞数组的合并。在命令行窗口中输入以下语句,并显示相应的输出结果。
>> clear
>> a{1,1}='cellclass';
>> a{1,2}=[1 2 2];
>> a{2,1}=['a','b','c'];
>> a{2,2}=[9 5 6];
>> a
a =
    2x2 cell 数组
    {'cellclass'}    {1x3 double}
    {'abc' }        {1x3 double}

>> b = {'Jan'}
b =
    1x1 cell 数组
    {'Jan'}

>> c = {a b}
c =
    1x2 cell 数组
    {2x2 cell}    {1x1 cell}

2) 元胞数组中指定单元的删除

如果要删除元胞数组中某个指定单元,则只需将空矩阵赋给该单元:
C{m,n} = []

【实例】有一个元胞数组C,删除其中的某个单元。
在命令行窗口中输入以下语句,并显示相应的输出结果。
>> clear
>> C = {ones(3), 'Hello, World', zeros(5), [20,4,6]}
C =
    1x4 cell 数组
    {3x3 double}    {'Hello, World'}    {5x5 double}    {1x3 double}

>> C{1,4} = []
C =
    1x4 cell 数组
    {3x3 double}    {'Hello, World'}    {5x5 double}    {0x0 double}

3) 使用reshape()函数改变元胞数组的形状

reshape() 函数的调用格式如下:
trimC = reshape(C, M, N)
该函数将元胞数组 C 改变成一个具有 M 行 N 列的新元胞数组。

【实例】将元胞数组 C(1×4)改变成 newC(4×1)。
在命令行窗口中输入以下语句,并显示相应的输出结果。
>> newC = reshape(C, 4, 1)
newC =
    4x1 cell 数组
    {3x3 double }  
    {'Hello, World'}
    {5x5 double }  
    {0x0 double }

相关文章