MATLAB的cell数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB的cell数组相关的知识,希望对你有一定的参考价值。
参考技术A 5 Cell数组元胞数组(cell)是MATLAB的一种特殊数据类型。可以将元胞数组看做一种无所不包的通用矩阵,或者叫做广义矩阵。组成元胞数组的元素可以是任何一种数据类型的常数或者常量,每一个元素也可以具有不同的尺寸和内存占用空间,每一个元素的内容也可以完全不同。和一般的数值矩阵一样,元胞数组的内存空间也是动态分配的。图3-3是元胞数组的结构示意图,表示的是一个2´3的元胞数组。元胞数组的第1行包括了无符号整数、字符串数组和一个复数数组,第2行包括了其他3种类型的数组,其中最后一个是另外的元胞数组的嵌套。
图3-3元胞数组结构示意图
和数值数组一样,元胞数组的维数不受限制,元胞数组可以是一维的、二维的,也可以是多维的。对元胞数组的元素进行寻访,可以使用“单下标”方式或者“全下标”方式。
结构数组和元胞数组有着非常相似的功能,但是二者又有所区别,具体比较如下。
结构数组和元胞数组在使用目的上类似,都是提供一种存储混合格式数据的方法。二者最大的区别在于:结构数组存储数据的容器称做“域”,而元胞数组是通过数字下标索引来进行访问的。
结构数组经常用于重要数据的组织存储。而元胞数组因为采用数字下标,所以经常在循环控制流中使用。元胞数组还常被用来存储不同长度的字符串。
在实际应用中,二者一般可以随意选择,多数情况下无论选用其中哪一种类型都可以达到目的,用户可以根据自己的习惯和实际应用来决定。
5.1 Cell数组的创建
组成元胞数组的数据可以是任意类型的数据,所以在创建元胞数组之前需要创建相应的数据。本小节结合具体的实例介绍创建元胞数组的方法。
在表现形式上,元胞数组和一般矩阵一样,元胞数组的尺寸也必须是长方形的。一般矩阵的创建使用中括号" [ ]",而元胞数组使用的是花括号" "。元胞数组的创建方式同矩阵的创建方式类似,只需要将中括号" [ ]"替换为花括号" "即可。在元胞数组创建的过程中使用逗号或者空格来分隔元素,使用分号来分行。
【例3-21】 创建元胞数组示例。
>> A = [1 4 3; 0 5 8; 7 2 9], 'Anne Smith'; 3+7i, -pi:pi/4:pi;
>> A
A =
[3x3 double] 'Anne Smith'
[3.0000 + 7.0000i] [1x9 double]
本例中元胞数组A的第一个元素是一个数值矩阵,矩阵的输入只需要使用正常的中括号" [ ]"即可。而第一行第二列字符串也是正常使用单引号即可。
【例3-22】 嵌套元胞数组创建示例。
(1)直接创建嵌套元胞数组,只需要将内层和外层的元胞数组都用花括号括起来即可。
>> header = 'Name', 'Age', 'Pulse/Temp/BP'; % 元胞数组的创建
>> records(1,:) = 'Kelly', 49, 58, 98.3, [103, 72];% 嵌套元胞数组的创建
>> header, records
header =
'Name' 'Age' 'Pulse/Temp/BP'
records =
'Kelly' [49] 1x3 cell
(2)通过分步来创建元胞数组则更加清楚明了。
>> vitalsigns = 60, 98.4, [105, 75];
>> records(1,:) = 'Kelly', 49, vitalsigns
% 将元胞数组vitalsigns嵌套进records
records =
'Kelly' [49] 1x3 cell
【例3-23】 依次创建元胞数组示例。
用户还可以通过每次创建一个元胞的方式,依次创建元胞数组,MATLAB会根据表达式依次对原有的元胞数组进行扩展,从而建立新的元胞数组。例如:
>> A(1,1) = [1 4 3; 0 5 8; 7 2 9];
>> A(1,2) = 'Anne Smith';
>> A(2,1) = 3+7i;
>> A(2,2) = -pi:pi/4:pi;
如果用户对超出数组尺寸的元胞进行赋值,那么MATLAB就会自动扩展至新的尺寸,以将新赋的值包括进来。例如将上面的A由2´2扩展为3´3,可以使用如下命令:
>> A(3,3) = 5;
扩展之后的元胞数组A示意图如图3-4所示。
图3-4元胞数组A示意图
除了上面所讲的方法之外,MATLAB还提供了一个专门的函数来建立元胞数组,即cell函数。cell函数用于创建一维、二维或者多维空元胞数组。
【例3-24】 创建空元胞数组示例。
>> a=cell(1)
a =
[]
>> b=cell(3,3)
b =
[] [] []
[] [] []
[] [] []
>> c=cell(2,2,2)
c(:,:,1) =
[] []
[] []
c(:,:,2) =
[] []
[] []
>> whos
Name Size Bytes Class Attributes
a 1x1 8 cell
b 3x3 72 cell
c 2x2x2 64 cell
使用cell函数创建空元胞数组的主要目的,是为数组预先分配连续的存储空间,节约内存占用,提高执行的效率。
5.2 Cell数组的寻访
元胞数组的寻访和一般数组的寻访类似,但是情况更为复杂。
对于二维数组A来说,A(2,4)表示的就是数组第2行第4列上的元素。但是对域元胞数组来说就不这么简单了。在元胞数组中,元胞和元胞里的内容是两个不同范畴的东西。因此,寻访元胞和元胞中的内容是两种不同的操作。为寻访不同的内容MATLAB设计了两种不同寻访的方法:“元胞外标识(cell indexing)”和“元胞内编址(Content addressing)”。
以元胞数组A为例,A(2,4)指的是元胞数组中的第2行第4列的元胞元素,而A2,4指的则是元胞数组中的第2行第4列的元胞内容。注意:这两种方式的区别仅在于使用的括号不同。
【例3-25】 元胞数组的寻访示例。
>> a=20,'matlab';ones(2,3),1:3
a =
[ 20] 'matlab'
[2x3 double] [1x3 double]
>> str=a1,2 % 返回字符型数组str,a1,2表示对应元胞的内容
str =
matlab
>> class(str) % 查看变量str的数据类型,结果确为字符型
ans =
char
>> str2=a(1,2) % a(1,2)表示元胞数组中的一个元胞
str2 =
'matlab'
>> class(str2) % 查看变量str2的数据类型,结果为元胞数组
ans =
cell
MATLAB中cell函数用法
cell元包是matlab中提供的一种数据类型,功能强大。
关于cell的创建:
1.跟一般创建举证一样,直接使用C = {A B D E}这种形式,不过这里把"[]"改成了}"{}"
2.使用cell创建cell,C= {C1 C2},这里C1和C2都是cell类型,直接把C1 C2作为一个cell得到的C3是一个1x2的cell数组;使用C3 = [C1 C2],是使用C1和C2的内容来创建cell数组
3.使用cell函数,A=cell(2,2),创建一个空的2x2的cell矩阵.
关于cell的访问:
1.X = C(s)使用这种"()"形式的返回的是cell类型
2.X = C{s}使用这种"{}"形式的返回的是cell中的内容
3.其他的基本上与通常的数组.矩阵访问一样了
4.A{1,1}(2,3:end)访问的是A中的第一个cell里面内容的第2行的第三个元素以后的所有元素
5.A{1,3}.name访问的是A中的A{1,3}cell里面结构的name值
6.cell的图形化显示使用命令cellplot(A)即可
关于cell的删除:
1.cell(1)=[]删除第一个cell,不能使用cell{1}=[],这是把第一个cell内容置空没有删除
>>C4={C1,C2,C3}
C4 =
{3x2 cell} {3x3 cell} {3x1 cell}
>> C4(1)=[]
C4 =
{3x3 cell} {3x1 cell}
2.cell(:)=[]删除所有的cell,其他的删除一次类推
>> C4(:)=[]
C4 =
{}
B={[1;2]}
这就定义了一个cell型的变量B,里面保存的是一个矩阵[1;2]
要引用里面的数据只要在大括号里写上对应的下标即可,如
B{1}
下面我们给B再加个元素,我们可以这样定义
B(2)={‘hello‘}
也可以利用引用的方法定义
B{2}=‘hello‘
第二种方法比第一种方法更方便所以更常用。
这样B就有两个元素了,B(1)是{[1;2]},B(2)是{‘hello‘},每个元素都是cell型的(注意和B{1}、B{2}的区别,B{1}是[1;2],B{2}是‘hello‘)
以上是关于MATLAB的cell数组的主要内容,如果未能解决你的问题,请参考以下文章