cell(元胞数组,又名元组)最大的特点是其中的每个元胞都可以包含任意类型的数据,不仅数据类型是任意的,大小也是任意的。它就像一个海纳百川的容器。

这个是真好,因为有很多时候,我们事先并不知道我们要读取的数据的类型和长度,特别是长度,真得是很多情况下并不知道呢。

比如我们批量读取一批文件,每个文件都有文件名,我们要用一个二维字符串数组把名字存下来,但因为每个文件的文件名长度不一样,所以我们无法事先定义好二维字符串数组每个元素的长度。

再比如我们要批量读取一组图片,每个图片都有不同的宽高,我们也无法事先预先定义存储每一张图片的矩阵尺寸。

这个时候我们使用cell就可非常方便的解决以上两个问题了。

来看cell是如何解决上面的第一个问题的,即用一个变量存储多个文件的文件名。

示例代码如下:

[FileName,PathName,Indx]=uigetfile({'*.*','All Files (*.*)'},...
                                    'Open Video File','MultiSelect','on');

上面这段代码运行后,将弹出文件选取对话框,我们选取多个文件,那么程序将返回被选到的多个文件的文件名,并存储在变量FileName中,我们选择三个文件,如下图所示:

CellRangeAddress 详解 cell(contents)_数组

 

CellRangeAddress 详解 cell(contents)_MATLAB的元胞数组_02

 

CellRangeAddress 详解 cell(contents)_CellRangeAddress 详解_03

可见, 程序运处后,FileName为一个cell类型的数组,里面存储了三个不长度的字符串。

再来看cell是如何解决上面的第二个问题的,即用一个变量存储多幅不同尺寸的图像。

文件夹中有四张图片,如下图所示:

CellRangeAddress 详解 cell(contents)_MATLAB的cell_04

 它们的尺寸分别如下:

CellRangeAddress 详解 cell(contents)_MATLAB的元胞数组_05

 

CellRangeAddress 详解 cell(contents)_MATLAB的cell_06

 可见,四幅图的尺寸都不一样,这就导致我们没法预先定义一个确定大小的四维数组去存储以上四张图像。

此时,我们便可以用cell实现我们的这个需求,即用一个变量存储多幅不同尺寸的图像。

代码如下:

N=4;
img_group=cell(1,N);
for i=1:N  
    imName=strcat(num2str(i),'.jpg');
    img_group{i}=imread(imName);
end

for i=1:N
    imgName = strcat(num2str(i),'张图');
    imgName = strcat('第',imgName);
    figure,imshow(img_group{i});title(imgName);
end

运行结果如下:

CellRangeAddress 详解 cell(contents)_MATLAB的元组_07

 从以上运行结果我们可以看到,虽然四张图的尺寸不一样,但四张图被正确存储到了cell数组img_group中,并且可被正确引用。

而且,从上面这个示例我们还知道了如何访问cell数组的元素了,即用花括号(大括号)加索引,比如下面这条语句。

img_group{i}=imread(imName);

另外,有时我们需要存储不同类型的元素,也可用cell。

比如下面的代码:

N=5;
cell_group=cell(1,N);

k1=int8(-5);
k2=uint16(88);
k3=single(567.3);
k4=double(999.3563);
k5='i love you';

cell_group{1}=k1;
cell_group{2}=k2;
cell_group{3}=k3;
cell_group{4}=k4;
cell_group{5}=k5;

运行结果如下图所示:

CellRangeAddress 详解 cell(contents)_数组_08

 

CellRangeAddress 详解 cell(contents)_CellRangeAddress 详解_09