Cell是Matlab中的一种数据类型,概念和结构类似。用大括号定义,括号里可以是任意类型的数据或矩阵。
关于cell的创建:
1.跟一般创建矩阵一样,直接使用C = {A B D E}这种形式,不过这里把"[]"改成了"{}"
2.使用cell创建cell,C= {C1 C2},这里C1和C2都是cell类型,直接把C1 C2作为一个cell得到的C3是一个1x2的cell数组;使用C3 = [C1 C2],是使用C1和C2的内容来创建cell数组
3.使用cell函数,A=cell(2,2),创建一个空的2x2的cell矩阵.
关于cell的访问:
1.X= C(s)使用这种"()"形式的返回的是cell类
2.X = C{s}使用这种"{}"形式的返回的是cell中的内容
3.其他的基本上与通常的数组.矩阵访问一样了
4.A{1,1}(2,3:end)访问的是A中的第一个cell里面内容的第2行的第三个元素以后的所有元素
5.A{1,3}.name访问的是A中的A{1,3}cell里面结构的name值
6.cell的图形化显示使用命令cellplot(A)即可如B={[1;2]},这就定义了一个cell型的变量B,里面保存的是一个矩阵[1;2],要引用里面的数据只要在大括号里写上对应的下标即可,如B{1}。
下面我们给B再加个元素,我们可以这样定义B(2)={'hello'}。也可以利用引用的方法定义B{2}='hello'。第二种方法比第一种方法更方便所以更常用。
这样B就有两个元素了,B(1)是{[1;2]},B(2)是{'hello'},每个元素都是cell型的(注意和B{1}、B{2}的区别,B{1}是[1;2],B{2}是'hello')。
cell数组的一些操作
- 创建:直接使用{}以及cell(...)形式,另外 下标法赋值也可以.注意后两种可以预配内存,内存是空间连续的~
- 读取内容:{下标}和(下标) 区别在于类型()是cell数组 ,{}是实际类型.结果显示是一致的
- >> a={'啊',123,[3 5 6],[1 2;7 8],sym(1)}
- a =
- '啊' [123] [1x3 double] [2x2 double] [1x1 sym]
- >> class(a{1})
- ans =
- char
- >> class(a(1))
- ans =
- cell
- >>
- C{5,3}{4,7}(:,4)
- 解读: cell数组的一个元素为cell类型,包含一个普通矩阵类型
- x = C{5,3}; % x is a cell array
- y = x{4,7}; % y is also a cell array
- z = y(:,4) % z is a standard array
- 复制代码
- 调整内容:添加和删除与普通矩阵方法一致
- 相关函数:
- celldisp:显示所有的内容
- cell:创建空的元胞数组
- cellplot:利用图形方式显示内容
- cell2mat:将数组转变成为普通的矩阵
- mat2cell:将数值矩阵转变成为cell数组
- num2cell:将数值数组转变成为cell数组
- cell2struct:将数组转变成为结构
- struct2cell:将结构转变为cell数组
- iscell:判断输入是否为cell数组
- cellfun:为cell数组的每个cell执行指定的函数 fun可以是特殊函数或者句柄
- days{1} = 'Sunday'; days{2} = 'Monday';
- days{3} = 'Tuesday'; days{4} = 'Wednesday';
- days{5} = 'Thursday'; days{6} = 'Friday';
- days{7} = 'Saturday';
- shortNames = cellfun(@(x)x(1:3), days, 'UniformOutput', false)
- shortNames =
- 'Sun' 'Mon' 'Tue' 'Wed' 'Thu' 'Fri' 'Sat'
- 复制代码
- deal:将输入参数赋值给输出 [Y1, Y2, Y3, ...] = deal(X{:}) ->可以简化[a,b,c,d] = C{:}
cell数组的类型转换看到上面的那些类型转换函数,也许你会笑了,感觉也没有什么特别的,但是使用过这个cell数组的朋友,估计大部分都会有转换失败的经历-_-很坑爹的...
Cell Array and Struct Array
- s = cell2struct(c, fields, dim) cell数组转换为struct数组,注意fields为char数组或者cell数组,而且size(c,dim) == length(fields) % If fields is a cell arraysize(c,dim) == size(fields,1) % If fields is a char array 这个经常错误就是fields类型以及dim不对
- c = struct2cell(s) struct数组转换为cell数组 这个基本没有什么错误的
Matrix and Cell Array
c = mat2cell(x, m, n) 转换为 m行n列cell数组 m = cell2mat(c) 必须是同一类型,而且限制不可包含cell数组或object类型,但是struct结构是可以的(同样这个struct不含 cell和object类型,否则依旧出错)
Double and Cell Array
C = num2cell(A, [dim1, dim2, ...]) 返回C的维数是numel(A)/prod(X,Y,...) dimN 是一个整数,范围是1到ndims(A)
只有数值矩阵才可以直接转换为cell,没有供cell转为double的方法.这是非常让人恼火的!不过理解之后就知道,cell本来就是混合类型的,直接转向数值类型单一矩阵,这样是不合理的.通常如果是的确是数值类型的可以走以下路线:cell->cell2mat 这时候注意cell2mat的条件非cell和object.否则,循环或者cellfun处理.如果可以使用 cell2mat 或者cat(dim,c{:}).很多时候都很方便
Cell Arrays of Strings
单独列出了是因为很多时候都要接触这个,基本txt之类读取来的数值数据都是char的cell数组~
可以使用cell参数与字符有关的部分函数(基本都支持)
- cellstr Convert a character array to a cell array of strings.会去除末尾空白
- char Convert a cell array of strings to a character array. 会恢复转换时候失去的空白
- deblank Remove trailing blanks from a string.
- iscellstr Return true for acell array of strings.
- sort 排序.
- strcat连接字符.
- strcmp对比字符.
- strmatch 查找字符.
- strrep 替换字符
- regexp系列及accumarray支持行列向量
例子:
C{1,1}=pi;C{1,2}=1;C{1,3}=ispc
C{1,1} = pi;%定义了一个1×1的cell数据,填充的数据为pi的值,即3.1416
C{1,2} = 1;%同样将C变为1×2的cell数据,第二个位置填充的是1
C{1,3} = ispc;%将ispc的值赋给C的第三个位置
%ispc是个系统函数,当Matlab软件是Windows版本,则返回1,否则返回0