加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MATLAB中坑爹的cell使用笔记汇总-自己备份

(2017-10-20 22:01:36)
分类: MATLAB
在MATLAB中,数值数组的存储单元内存储的数据类型必须是一模一样的,而且各元素的长度要一致(其它语言也是这样),即数值数组的存储单元内储存的数据必须是相同长度的数值类型。

cell也称为元胞,cell数组内可以存储不同类型的数据,这是它的精华之处,但缺点是经常坑爹!

一、cell数组的创建方法及实例

1 直接创建

1.1 利用若干单引号对及一对花括号直接创建一个cell数组

>> s1 = {'124','zifu','','15dgg'}
>> class(s1)             % 查看s1的类型
ans = cell
>> size(s1)              % 查看大小维数等
ans = 1     4
>> length(s1)            % 查看元素总数
ans = 4

或者这样
>> s2 = {'124';'zifu';'';'15dgg'}
>> class(s2)             % 查看s2的类型
ans = cell
>> size(s2)              % 查看大小维数等
ans = 4     1
>> length(s2)            % 查看行数和列数的最大值
ans = 4

也可以这样输入:两行两列矩阵形式
>> s231 = {'124','zifu','';'','15dgg','456'}
>> s232 = {'124',rand(3,4),'';'','15dgg',rand(2,3)}
s232 = 
    '124'    [3x4 double]    ''          
    ''       '15dgg'         [2x3 double]

1.2 直接输入cell数组中cell内容(方法1)
赋值符右边使用小括号访问cell地址,左边使用一对花括号加一对单引号对

>> s3(2,1) = {'21'}; s3(1,3) = {'zifu13'}; s3(2,2) = {'zifu22'};s3(2,3) = {''}
s3 = 
      []          []    'zifu13'
    '21'    'zifu22'    ''
>> size(s3)
ans = 2     3
>> length(s3)
ans = 3

1.3 直接输入cell数组中cell内容(方法2)
赋值符右边使用一对花括号直接对cell元素直接赋值,左边使用一对单引号对

>> s4{1,2} = rand(3,4); s4{1,3} = 'zifu13'; s4{2,1} = '21';
>> s4{2,2} = 'zifu22';s4{2,3} = rand(2,3)
s4 = 
      []    [3x4 double]    'zifu13'    
    '21'    'zifu22'        [2x3 double]

记忆技巧:cell数组直接赋值创建,花括号和小括号是左右同时对称出现的
例如:左边用了小括号(),那么右边必须用花括号{}指定cell内容了
      左边用了花括号{},那么右边必须用小括号指定一个值或矩阵或字符等,类似于小括号()

1.4 利用cell(m,n)创建m行n列的空cell数组(矩阵)
>> s5 = cell(2,3)
>> s5(1,3) = rand(5)           % !!!错误:把一个内容赋值给cell对象,会导致类型转换错误
>> s5(1,3) = {rand(5)}         % 可以:表示s5的第1行第3列的cell对象赋值为{rand(5)}
>> s5{1,3} = rand(5)           % 可以:表示s5的第1行第3列的cell内容赋值为rand(5)


2 间接创建
可以类似数值数据或矩阵一样操作cell数组的部分,用冒号:运算符
>> sa = s4(1:2,2:3)
sa = 
    [3x4 double]    'zifu13'    
    'zifu22'        [2x3 double]

使用元胞的下标,可将一个元胞数组的子集赋值给另一个变量,创建新的元胞数组。
>> a=[{1},{2},{3};{4},{5},{6};{7},{8},{9}]
>> b=a(2:3,2:3)
>> c=a(1:3,2:3)

二、cell数组的读取
  ()和{}有着本质的区别,花括号用于表示元胞的内容,小括号表示指定的元胞。
  理解方式:
  对数值数组或矩阵来说:如定义为 A = rand(5,6); 读取第2行第3列的内容用  A(2,3)
  特点是:数值数组或矩阵,不管定义数组还是读取数组的元素内容  都用一对小括号()

  因此,对于cell数组来说,定义cell数组和读取cell数组的元素内容都用{}
  注意读取元胞的差别
  X = C(s) 使用这种"()"形式的返回的是cell类的对象
  X = C{s} 使用这种"{}"形式的返回的是cell中的内容

>> s4{2,3}
% 由于采用了随机数生成,每次运行s4{2,3}的结果会有差别
ans =
    0.1190    0.9597    0.5853
    0.4984    0.3404    0.2238
>> s4{2,3}(1,1)
ans = 0.1190
>> s4(2,3)
ans = [2x3 double]


三、元胞数组的删除和重塑

要删除单元数组中的行或列,可以用冒号表示单元数组中的行或列,然后对其赋一个空矩阵即可。

>> a={20,'matlab';ones(2,3),1:3}

>> a{1,:}=[]                       % !!!错误
>> a(1,:)=[]                       % 删除a的第一行所有元素,变成1*2(沿用数值矩阵语法)
a =  [2x3 double]    [1x3 double]

>> a{1} = []                       % 给第一行第一个元素内容赋值为空,不是删除
a =  []    [1x3 double]

>> a(1) = []                       % 删除第一行第一个,删除
a =  [1x3 double]

  四、元胞数组中的操作函数

  cell:创建空的元胞数组
  cellfun:为元胞数组的每个元胞执行指定的函数
  celldisp:显示所有元胞的内容
  cellplot:利用图形方式显示元胞数组
  cell2mat:将元胞数组转变成为普通的矩阵
  mat2cell:将数值矩阵转变成为元胞数组
  num2cell:将数值数组转变成为元胞数组
  deal:将输入参数赋值给输出
  cell2struct:将元胞数组转变成为结构
  struct2cell:将结构转变为元胞数组
  iscell:判断输入是否为元胞数组

  cellfun函数的主要功能是对元胞数组的元素(元胞)分别指定不同的函数,不过,能够在cellfun函

数中使用的函数ushuliang是有限的。  
  能在cellfun中使用的函数:
  isempty:若元胞元素为空,则返回逻辑真
  islogical:若元胞元素为逻辑类型,则返回逻辑真
  isreal:若元胞元素为实数,则返回逻辑真
  length:元胞元素的长度
  ndims:元胞元素的维数
  prodofsize:元胞元素包含的元素个数

  元胞数组变形
  通过reshape函数改变形状,改变后的元胞数组与原元胞数组的元素个数相同,不能通过改变形状来添

加或删除元胞数组中的元素。
>> a=cell(4,4)
>> b=reshape(a,2,8)

五、常用经验摘录:
cell不要用来存储太复杂的数据,主要用来存储一些长度不同的相同类型的向量就好
这样不会出现太多的坑爹的陷阱和错误

利用一个cell数组存储几个维数不同的向量,这个问题经常遇到。
例如第一个要存储9个数值,第二个要存储4个数值,在适当的时候还要读取里面的元素数值。

>> s = cell(1,5)
>> b1 = [1 2 3 4 0 0 4 7 8];s{1} = b1
>> b2 = [5 6 7 8];
>> s(2) = {b2}  或   >> s{2} = b2   % 效果一样(推荐用一种方式)

要读取数据5可以使用:
>> s{2}(1)

或代码分开使用
>> ts2 = s{2}; ts2(1)

另外,这样生成ts2也可以,但仅限于数值:
>> ts2 = cell2mat(s(2))

>> tt = s(1:2)             % 将s的前两个元赋给新的cell变量

>> class(s{1})
ans = double
>> class(s(1))
ans = cell
>> class(tt)
ans = cell

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有