单元数组和结构数组都属于构造类型的数据结构,可以将不同维度,不同类型的数组组合到一起
单元数组内部保存的类似于C语言中的指针,指向其他类型变量。单元数组的创建可以是赋值语句也可以是cell函数或者用{}
索引方式有内容索引和单元索引。在查询一个单元数组内容的时候,不同的查询方式会得到不同的结果:
所以创建cell数组的时候可以用同样的方式
如果采用圆括号的形式进行赋值操作就好比将数据直接赋值给指针就会出错
采用的方法是用大括号将矩阵包起来作为其中内容进行赋值操作
采用函数直接创建的是一个空的cell数组
c=cell(m,n)%m*n的单元数组
c=cell(size(A))%创建和A同样纬度的单元数组
cell创建的意义是占位作用,创建好之后可以用变量编辑器进行修改操作
可以用大括号一次性创建完成:
前面提到如果要对cell数组元素内容进行查看,只能通过大括号访问逐一查看,通过函数可以实现全部查看:
celldisp() cellplot()(图形方式显示)
想删除单元数组全体的话,使用clear 数组名即可
字符串单元数组:在前面提到过一个字符串连接函数strvcat() 他在竖直方向上连接两个字符串,采取的方式是自动补全需要添加的空格。而字符型单元数组就好像是C语言中的字符串指针数组,不必要求内部的字符串的长度一定相同。
其创建形式与普通的单元数组一致 cellstr和char函数可以实现在字符型单元数组和普通字符数组之间进行转化
iscell iscellstr 可以用来判断普通数组普通字符串和cell数组和cell字符串
普通数组转化成单元数组使用函数mat2cell或者num2cell它们的区别就是前者会将原数组整体作为cell数组的一个元素,而后者会将原数组中所有数字分开作为cell的一个元素
注意删除数组或者单元数组的某一行或者某一列不能用每个元素赋值为[]解决,应该类似于这样:
a[1,:]=[]
单元数组的嵌套就类似于c语言中的结构体嵌套,由于在单元数组没有.运算符固采用这种形式进行二级访问:
结构数组的引入:普通数组,单元数组虽然有名字,但是元素只能通过下标来访问。结构数组元素有自己的名字,而且可以存储不同类型的数据。元素称为域,数组名.域名可以访问具体的元素(这点类似于javascript)
创建方式:赋值语句,struct函数
student.name='aaa';%赋值语句
student.age='99';
student.gender='???';
student(2).name='bbb';
student(2).age='77';
student(2).gender='!!!';
student(2).grade=[1 0 0];
在上例中student(1).grade没有被赋值,会自动被赋值为空
s=struct('Math',146,'English','75','Politics',70,'Major',140)%函数创建法
struct创建方法有一个情况就是数据里如果出现空的,比如大括号
s=struct('Math',150,'English',{})
那么整个结构数组就会变成一个0*0的
还有就是数据可以是标量也可以是一个单元数组,最后的维度和单元数组对应。(这里注意单元数组维度保持一致)
以下是两种特殊情况
如果要给结构体数组增加域,直接使用赋值语句。如果要删除域名使用rmfield函数
s=rmfield(s,'field');
获取或者赋值还可以使用setfield和getfield函数,留到后面讨论。
orderfields函数可以用来变更fields排序,默认只输入struct的名字后按照ASCII顺序排序,如果orderfields函数后面是两个参数,orderfields(A,B) A按照B的方式进行排序
isstruct和isfield用来判断对应的结构数组和域名。注意isfield函数有两个参数即
isfield(A,'B')%前面是结构数组名,后面是结构数组中对应的域名,注意后面要加单引号
细胞数组转化成结构数组:
fieldnames返回一个单元数组,里面的值是结构数组的域名,相当于上一步的逆运算
结构数组转化成单元数组时候如果内部没有结构数组的嵌套会转化成二维的
如果本身是1*多的情况就会转化成多维的单元数组