在Matlab中,元胞数组是一种特殊数据类型,可以将元胞数组看作一种无所不包的通用矩阵(广义矩阵),组成元胞数组的元素可以是任何一种数据类型的常数或常量。
数据类型可以是字符串、双精度数、稀疏矩阵、元胞数组、结构或者其他matlab数据类型,每一个元胞数据可以是标量、向量、矩阵、N维数组,每一个元素可以具有不同的尺寸和内存空间,内容可以完全不同,元胞数组的元素叫做元胞,元胞数组的内存空间是动态分配的,元胞数据的维数不受限制,访问元胞数据可以单下标方式或全下标方式。
元胞数组的创建主要有以下几种方法:
1.使用运算花括号{},将不同类型和尺寸的数据组合在一起构建一个元胞数组;
2.将数组的每一个元素用{}括起来,然后再用数组创建的符号[]将数组的元素括起来构成一个元胞数组;
3.用{}创建一个元胞数组,Matlab能够自动扩展数组的尺寸,没有明确赋值的元素作为空元胞数组存在;
4.用函数cell创建元胞数组。该函数可以创建一维、二维或者多维元胞数组,但创建的数组都为空元胞。
元胞数组的基本操作:
元胞数组的基本操作包括对元胞和元胞数据的访问、修改、元胞数组的扩展、收缩或者重组。操作数值的函数也可以应用在元胞数组上。
在Matlab中元胞数组的访问有以下几种方法:
1.可以使用圆括号()直接访问元胞数组的元胞,获取的数据也是一个元胞数组;
2.使用花括号{}直接访问元胞数组的元胞,获取的数据是字符串;
3.将花括号{}和圆括号()结合起来使用访问元胞元素内部的成员。
元胞元素的扩充、收缩和重组均与数值数组大体相同。
A=[{zeros(2,2,2)},{'word'},{15.36},{1:100}]
B=A(1,2)
class(B)
whos
A =
[2x2x2 double] 'word' [15.3600] [1x100 double]
B =
'word'
ans =
cell
Name Size Bytes Class Attributes
A 1x4 1328 cell
B 1x1 120 cell
ans 1x4 8 char
A=[{zeros(2,2,2)},{'word'};{15.36},{1:10}]
B=A{1,2}(2)
C=A{2,2}(5:end)
class(C)
F=A{4}([1 3 5])
whos
A =
[2x2x2 double] 'word'
[ 15.3600] [1x100 double]
B =
o
C =
5 6 7 8 9 10
ans =
double
F =
1 3 5
Name Size Bytes Class Attributes
A 2x2 1328 cell
A1 1x1 8 double
A2 1x1 8 double
A3 1x1 8 double
B 1x1 2 char
C 1x96 768 double
F 1x3 24 double
ans 1x6 12 char
元胞数组的扩充示例:
A=[{zeros(2,2,2)},{'word'};{15.36},{1:10}]
B=cell(2)
B(:,1)={char('hello','Welcome');10:-1:5}
C =[A,B]
D=[A,B,C]
whos
A =
[2x2x2 double] 'word'
[ 15.3600] [1x10 double]
B =
[] []
[] []
B =
[2x7 char ] []
[1x6 double] []
C =
[2x2x2 double] 'word' [2x7 char ] []
[ 15.3600] [1x10 double] [1x6 double] []
D =
[2x2x2 double] 'word' [2x7 char ] [] [2x2x2 double] 'word' [2x7 char ] []
[ 15.3600] [1x10 double] [1x6 double] [] [ 15.3600] [1x10 double] [1x6 double] []
Name Size Bytes Class Attributes
A 2x2 608 cell
A1 1x1 8 double
A2 1x1 8 double
A3 1x1 8 double
B 2x2 316 cell
C 2x4 924 cell
D 2x8 1848 cell
F 1x3 24 double
ans 1x6 12 char
元胞数组的操作函数:
函数 | 说明 |
---|---|
cell | 创建空的元胞数组 |
cellfun | 为元胞数组的每个元胞执行指定的函数 |
celldisp | 显示所有元胞的内容 |
cellplot | 利用图形方式显示元胞数组 |
cell2mat | 将元胞数组转化为普通矩阵 |
mat2cell | 将普通的值矩阵转变为元胞数组 |
num2cell | 将数值数组转变为元胞数组 |
deal | 将输入参数赋值给输出 |
cell2struct | 将元胞数组转变为结构 |
struct2cell | 将结构转变为元胞数组 |
iscell | 判断输入是否为元胞数组 |
cellfun函数主要功能是为元胞数组的每个元素(元胞)分别指定不同的函数,在cellfun函数中可用的函数如下表:
函数 | 说明 |
---|---|
isempty | 若元胞为空,则返回逻辑真 |
islogical | 若元胞元素为逻辑类型,则返回逻辑真 |
isreal | 若元胞元素为实数,则返回逻辑为真 |
length | 元胞元素的长度 |
ndims | 元胞元素的维数 |
prodofsize | 元胞元素包含的元素个数 |
cellfun函数还有以下两种用法:
cellfun(‘size’,C,K)用于获取元胞数组元素第K维的尺寸。
cellfun(‘isclass’,C,classname)用于判断元胞数组的数据类型。
用法如下:
A={rand(2,2,2),'word',pi,17,1+i,magic(5)}
B=cellfun('isreal',A)
C=cellfun('length',A)
A =
[2x2x2 double] 'word' [3.1416] [17] [1.0000 + 1.0000i] [5x5 double]
B =
1 1 1 1 0 1
C =
2 4 1 1 1 5
D={[1] [2 3 4];[5;9] [6 7 8; 10 11 12]}
E=cell2mat(D)
D =
[ 1] [1x3 double]
[2x1 double] [2x3 double]
E =
1 2 3 4
5 6 7 8
9 10 11 12
D=[1 2 3 4; 5 6 7 8; 9 10 11 12]
E=mat2cell(D,[1, 2],[1,3])
D =
1 2 3 4
5 6 7 8
9 10 11 12
E =
[ 1] [1x3 double]
[2x1 double] [2x3 double]
参考:《MATLAB GUI程序设计》王广、邢林芳