MATLAB数据类型 — 元胞(Cell)

前言

在编写MATLAB程序时,我们可以不指定变量的数据类型。这使得MATALB编程很接近演算纸式的科学计算。当然,这也造成使用者往往忽略了MATLAB中的数据类型。了解MATLAB中的数据类型,可以更好的帮助我们进行MATALB编程。

在MATLAB编程中,常用的基本数据类型有:

(1) logical(逻辑);(2) char(字符);(3) numeric(数值);(4) cell(元胞);(5) struct(结构体);(6) function handle(函数句柄)。

对于有C语言基础的使用者来说,前面3种基本数据类型是很熟悉的,后面3种基本数据类型则需要进一步的了解。本文章将讲述cell(元胞)类型,该类型在复杂编程中常被使用。

正文

元胞是一个很独特的数据类型。与其他数据类型不同,它可以存储任意类型的数据,例如逻辑型、字符型和数值型等,甚至是元胞型。

那么,你可能会联想到元胞数组可以同时存储不同类型和大小的数据。答案当然是肯定,这就是元胞数组最大的特点。这里你可能会有疑问,数组的每一个元素不应该是同一类型的嘛,这是不是违反了这一点?其实并没有,元胞数组每一个元素都是元胞类型,这正好符合上述特性。而每一个元胞都可以存储任意类型的数据,才形成了元胞数组可以同时存储不同类型的数据。

1. 元胞数组的创建

  • 使用符号{ }来创建
% 2x3的元胞数组
C = {true, 2, 'text'; [], rand(5, 10, 2), {11; 22; 33}}

代码运行结果如下。生成了2x3的元胞数组C,其中分别包含了逻辑型、数值型、字符数组、空数组、三维数组、元胞数组。

  • 使用函数cell()来创建
% 3x3的元胞数组
C1 = cell(3)
% 3x3的元胞数组
C2 = cell(3,2)

代码运行结果如下。分别生成了3x3的元胞数组和3x2的元胞数组,其中每个元胞存储的内容都是空数组。

2. 元胞数组的寻访

元胞数组的寻访有下面两种情况,一种是用()寻访元胞数组的内容,即元胞;另一种是用{}寻访元胞数组中元胞的内容。

C = {true, 2, 'text'; [], rand(5, 10, 2), {11; 22; 33}};
D1 = C(1, 1)  % 元胞数组C中第一行第一列的元胞
D2 = C{1, 1}  % 元胞数组C中第一行第一列的元胞的存储内容

代码运行结果如下。D1是元胞类型,而D2是逻辑型。

下面举个例子,说明两者区别。

% 定义一个1x1的元胞数组
C = {'text'};
% 做法一,可以取出'text'的第二个字符e
a1 = C{1}(2)
% 做法二,不能取出'text'的第二个字符e,报错
a2 = C(1)(2)
% 做法三,不能取出'text'的第二个字符e,报错
a3 = C(1)
a4 = a3(2)

代码运行结果如下。做法一是正确的。做法二和做法三是等价的,都是错误的。以做法三来分析,a3依然是一个1x1的元胞数组,和C一样。a3(2)的含义是取出元胞数组a3的第二个元胞,结果当然是超出纬度。

3. 对于元胞数组进行赋值

由于元胞数组的寻访有上述的两种,那对它进行赋值也有两种。

C = {true, 2, 'text'; [], rand(5, 10, 2), {11; 22; 33}};
% 做法一:赋值后,C中第一行第一列的元胞不是原来的元胞,而是新创建的元胞
C(1,1) = {'hello1'}

% 做法二:赋值后,C中第一行第一列的元胞还是原来的元胞,但是元胞的存储内容改变了。
C{1,1} = 'hello2'

代码运行结果如下。做法一实际上是更换元胞数组的元胞,做法二实际上是更换元胞数组中元胞的存储内容。

上面说的是对元胞数组中已有的元胞进行操作,而这里要说的是元胞数组的扩充

与上面的赋值一样,可以使用上述两种做法扩充元胞数组。但是,用这两种方法扩充元胞数组,新的元胞数组将是包含新增元素的最小元胞数组,而其它新增的元胞将会是空数组。此外,还可以用拼接的方法扩充元胞数组。根据拼接的方式(垂直拼接和水平拼接),待拼接的元胞数组必须符合对应的纬度要求。

figure
% 2x1的元胞数组
C = {2; 'text'};
subplot(2, 2, 1);
title('55');
cellplot(C);
title('原元胞数组')

%做法一:
C(1, 2) = {'扩展1'};
subplot(2, 2, 2);
cellplot(C);
title('扩展一');

%做法二:
C(2, 3) = {'扩展2'};
subplot(2, 2, 3);
cellplot(C);
title('扩展二');

%做法三:水平拼接,待拼接的元胞数组的行数必须相等
C = [C, C];
subplot(2, 2, 4);
cellplot(C);
title('拼接');

代码运行结果如下。 

4. 元胞数组的常用操作函数

有很多函数可以作用于元胞数组,下面举几个常用函数的简单用法。更多函数见元胞数组的官方帮助文档

  • 函数celldisp(),用文字方式显示元胞数组所有元胞的内容

  • 函数cellplot(),用图形方式显示元胞数组所有元胞的内容

  • 函数cellfull(),对元胞数组所有元胞执行一个函数

C = {'text', rand(2, 2)};
disp('这是celldisp');
celldisp(C);
cellplot(C);
title('这是cellplot');
disp('这是cellfun');
cellfun('isreal', C)

代码运行结果如下。 

博主:虔诚~似锦(主博客)

个性签名:如果你愿意努力,人生最坏的结果也不过是大器晚成。

------------------------------------------------------------------------------------

如果这篇文章对你帮助的话,记得在下方点赞哦,博主在此感谢!🎉🎉🎉

如果对这篇文章有疑问,请在评论区指出,欢迎探讨,共同进步。😄😄😄

  • 13
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值