
1.7 cell
MATLAB中的cell类型(元胞数组)是一个承载其他数据类型的容器,它可以包含任何MATLAB类型的数据,如数值、字符和句柄等,甚至其他cell数据。使用cell类型可以轻松实现复杂数据的嵌套。
1.7.1 实例15:两种常见的cell赋值方式
例64:创建空cell。

例65:对上例C中的每个元素依次赋值。
赋值通常有两种方式:第一种,等式左侧用圆括号取cell元素并将等式右侧的cell数据赋给左侧;第二种,等式左侧用花括号取cell的元素值并将等式右侧的数据值赋给左侧。

继续对C(2,2)中的2×2空cell赋值:用花括号先取得C{2,2}中的值2×2 cell之后,用“(1)”取出第一个子cell并用等号赋值为cell数据{′a′}。
>>C{2,2}(1)={′a′};
或者可采取第二种赋值方式:用花括号先取得C{2,2}中的值2×2 cell之后,用“{1}”取出第一个cell的值将此值赋为′a′。
>>C{2,2}{1}=′a′;
tips:取cell元素用圆括号,取cell中元素的值用花括号。双击【工作区】的变量以打开变量编辑器查看或修改变量,如图1-2所示。

图1-2 通过变量编辑器查看cell元素
1.7.2 实例16:mat2cell函数与num2cell函数
mat2cell函数可以将矩阵元素分块放置到cell中。
语法:
C=mat2cell(A,dim1Dist,…,dimNDist)
其中dim1Dist,…,dimNDist为向量,包含分隔的每个子cell在当前维度1,…,N下的长度。>>CM=ones(5,4);
>>C=mat2cell(CM,[2,3],[2,2])
C=
[2x2 double] [2x2 double]
[3x2 double] [3x2 double]
变量C的拆分结构如图1-3所示。

图1-3 矩阵转cell的结构拆分示意图
例66:num2cell函数可将矩阵中每个元素放置到一个cell中。
>>D=num2cell(CM)
1.7.3 实例17:cellstr函数
例67:cellstr函数可以将字符矩阵行中最后的空白字符删除。

例68:cellstr函数可将字符矩阵放到cell列向量中。

1.7.4 实例18:cell2mat函数
cell2mat函数可以将任意形状的数值cell转换为矩阵。
例69:将cell类型C转换回矩阵。
>>cell2mat(C)
数据的结构变化如图1-4所示。

图1-4 cell转数字矩阵的结构示意图
例70:将包含字符串的cell转为数值数组。
>>str2double({′1′,′2′;′1′,′2′})
ans=
1 2
1 2
1.7.5 实例19:用cellfun函数做cell元素遍历运算
利用cellfun函数可以遍历cell中的各个元素来进行函数运算。
语法:
cellfun(@fun,input)
例71:求cell中各元素的平均值。

tips:cellfun(@fun,input)中的fun函数句柄不仅限于系统内置函数,也可以使用自定义函数。
语法:
cellfun(@(x1,…,xN)fun,input1,…,inputN)
例72:求cell中元素的平均值。

例73:求2个cell中元素的和。

注意到输出的OUT中第一个cell元素为1×3矩阵,第二个cell元素为3×1矩阵,第三个cell元素为空。三个cell的尺寸不同,需要将′UniformOutput′参数设置为false。
例74:将cell中元素′a′替换为′b′。

tips:′UniformOutput′参数设置为false时返回cell类型,否则返回矩阵类型。
例75:判断股票属于上证(60开头)还是深证A股(00或30开头)并输出。

1.7.6 实例20:用findgroups函数和splitapply函数做cell分组运算
findgroups函数可以将cell按照指定列值进行分组;splitapply则可以对分组进行函数运算。
例76:计算分组均值。

findgroups函数也支持数值行或列向量的分组,如:
>>findgroups([1;1;2;2;2])
>>findgroups([1,1,2,2,2])
findgroups函数不支持字符格式的行或列向量,如findgroups([′a′;′a′;′b′])会报错,需要使用cellstr函数将输入转换为cell。
>>findgroups(cellstr([′a′;′a′;′b′]))