MATLAB量化金融分析基础与实战
上QQ阅读APP看书,第一时间看更新

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({1212})

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([aab])会报错,需要使用cellstr函数将输入转换为cell。

>>findgroups(cellstr([aab]))