前言
在编写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)
代码运行结果如下。
请发表评论