MATLAB使用和学习笔记01:Cell数组

关于cell数组

元胞数组最有用的地方在于,它可以在一个数组中的每个元胞里,存储不同的数据类型。就像人的身体里可以有神经元细胞,血红细胞等等,他们类型不同,但是统称细胞并共存在人体中。
元胞数组对于读取,处理和写入格式复杂的数据文件非常有用。

1. Cell的创建

  1. Cell = {1,2,3; ’abc’,[1:13],4.567}; %直接赋值,适用于元素不多的情况
  2. Cell = {}; %(创建空的元胞数组,以备用)
  3. Cell = {3,4,2}; %(同上,创建固定大小的空数组备用)
  4. for i = 1 : 35
    Cell{i,1} = i;
    end
    (注:这种方式会被提示Cell数组的大小一直在变,但若你无法事先估计Cell所要存储的数据大小,这种方式可以一试。)

2. Cell 的访问

基本的调用方式如下:

大括号{}:

  1. A = Cell{1,2};

假设Cell{1,2} 为一个一维数组:[1,2,3,4,5],想调取该数组的第4位数据:

  1. A = Cell{1,2}{4}

假设Cell 是一个1X5的数组,且这5个cell中的数据均为同类型,如:

  1. Cell = {1,2,3,4,5};
    A = [Cell{1,1:5}];
    %则结果为数组,即:
    A = [1 2 3 4 5]

注意:
1)这里给A赋值时,cell外一定要加方括号[],不=否则只会将第一位数据赋给A。
2)若这5个cell中的数据类型均为字符,则上述命令所获得的A是一个字符串。(也可以用strjoin函数)

下面的例子来自Mathwork:

C = {‘one’, ‘two’, ‘three’; 1, 2, 3}
C = 2x3 cell array
{‘one’} {‘two’} {‘three’}
{[ 1]} {[ 2]} {[ 3]}

在本例中,若赋值:

[r1c1, r2c1, r1c2, r2c2] = C{1:2,1:2}
%则结果为:
r1c1 =
‘first’
r2c1 = 1
r1c2 =
‘second’
r2c2 = 2

这个例子说明,赋值的顺序是按照列来的,先第一列再第二列,以此类推。

小括号()
圆括号并不直接调用Cell中的内容,它调取的是位置,是cell的索引。换句话说,{}传递的是cell中数据本来的类型,cell中的数据是float型,它就传float;是string,它就传string。而()传递的是cell类型。对比:

C = {1,2,3,4,5}
C =
1×5 cell 数组
[1] [2] [3] [4] [5]
A = [C{1,1:2}]
A =
1 2

以及:

A = C(1:2)
A =
1×2 cell 数组
[1] [2]

要利用()给cell赋值,也不能直接像对{}这样:~~Cell(1,1) = 5; ~~
而是:Cell(1,1) = {5};
因为等式左()调用的是位置,右{}表示该位置Cell的内容。
此外,凡调用参数为cell数组的函数,传参时也必须用()而不是{},原因同理。

3. 为Cell预分配内存(Mathwork)

元胞数组不需要完全连续的内存。但是,每个元胞都要求连续的内存,与 MATLAB® 创建用于描述数组的元胞数组头一样。对于大型数组,以递增方式增加元胞的数量或元胞中元素的数量会导致 Out of Memory 错误。(所以尽量不要用<Cell创建>中的第四种赋值方式,但如果你不能确定大型数组的行列数,就没有办法了……)

通过调用 cell 函数或分配给最后一个元素,来初始化元胞数组。例如,以下语句是等效的:

C = cell(25,50);
C{25,50} = [];

4. 删除Cell,合并Cell

例如:

C{1,4} = []; %只删除该cell中的元素,位置保留。
C(1,4) = []; %删除该cell中第四个位置,第五位cell前移。

下面这个例子来自Mathwork:

C1 = {1, 2, 3};
C2 = {‘A’, ‘B’, ‘C’};
C3 = {10, 20, 30};
%使用数组串联运算符 [] 串联元胞数组。在此示例中,通过使用分号分隔元胞数组来垂直串联元胞数组:

C4 = [C1; C2; C3]
C4 是一个 3×3 元胞数组:
C4 =
[ 1] [ 2] [ 3]
‘A’ ‘B’ ‘C’
[10] [20] [30]

%使用元胞数组构造运算符 {} 创建一个嵌套元胞数组:
C5 = {C1; C2; C3}

%C5 是一个 3×1 元胞数组,其中每个元胞都包含一个元胞数组:
C5 =
{1x3 cell}
{1x3 cell}
{1x3 cell}

5. Cell常用的函数

  1. cell2mat/mat2cell:

C = mat2cell(A,dim1Dist,…,dimNDist)
C = mat2cell(A,rowDist)

注意,dimDist,rowDist都是一维数组且必须是数组!数组的长度代表你在这个维度要划分的cell格数。数组中元素的值代表一个cell格子内在这个维度可分的格数。举个两例子,想把数组转化成1X3的cell,每个cell里为则:

C = mat2cell(A, ones(1,3)) ; %则A至少要有3行
C = mat2cell(A, [1,2,3]) ; %则A至少要有6行

  1. cellstr:

C = cellstr(A) 将 A 转换为字符向量元胞数组。输入数组 A 可以是字符数组或分类数组,从 R2016b 开始,也可以是字符串数组。

  1. num2cell:
    (略)

  2. strsplit:

C = strsplit(str) 在空白处将 str 拆分为 C。空白字符等效于集合 {’ ‘,’\f’,’\n’,’\r’,’\t’,’\v’} 中的任何转义序列。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值