matlab中数据结构之-cell array

  不同与matlab中的array数据结构中存储的都是一样的数据,cell array中可以存储不同的数据类型,而且cell array也可以是向量或矩阵,数组中不同的元素指向不同的数值。原来主要用来存储不同长度的字符串,cell arrays存储的是指向存储数据的指针。

1.直接创建创建cell arrays,将所有元素用{}包围即可,可以成vector或matrix均可

行向量:

cellrowvec={23, 'a', 1:2:9, 'hello'}
结果:cellrowvec =
  1×4 cell array
    {[23]}    {'a'}    {[1 3 5 7 9]}    {'hello'}

列向量:

cellcolvec={23; 'a'; 1:2:9; 'hello'}
结果:cellcolvec =
  4×1 cell array
    {[       23]}
    {'a'        }
    {[1 3 5 7 9]}
    {'hello'    }

矩阵:

cellmat = {23, 'a'; 1:2:9, 'hello'}
结果:cellmat =
  2×2 cell array
    {[       23]}    {'a'    }
    {[1 3 5 7 9]}    {'hello'}

2.cell array元素的引用,名称{index1, [index2]}, 如果元素是vector时,还需要继续索引才能取得vector中的真正的元素值,最后一个元素,索引可以用end

直接一次索引:

cellcolvec{1}
结果:ans =
    23

需要二次索引时

cellcolvec{end}
只一次索引:ans =
    'hello'
cellcolvec{end}(2)
二次索引:ans =
    'e'

若为矩阵可以用一个下标,按照列优先原则排成线性表;也可以直接用两个下标:

一个下标

cellmat{4}(2)
结果:ans =
    'e'

两个下标

cellmat{2,2}(2)
ans =
    'e'

倘若是最后一个,也可以用end索引:

cellmat{end}(2)
结果:ans =
    'e'

补充:使用cell函数创建空的cell array,通过对其引用进行赋值:

mycellmat=cell(2,2)
结果:mycellmat =
  2×2 cell array
    {0×0 double}    {0×0 double}
    {0×0 double}    {0×0 double}

创建空的cell array成功,

mycellmat{1,1}=23
mycellmat =
  2×2 cell array
    {[      23]}    {0×0 double}
    {0×0 double}    {0×0 double}
>> mycellmat{1,2}='a'
mycellmat =
  2×2 cell array
    {[      23]}    {'a'       }
    {0×0 double}    {0×0 double}
>> mycellmat{2,1}=1:2:9
mycellmat =
  2×2 cell array
    {[       23]}    {'a'       }
    {[1 3 5 7 9]}    {0×0 double}
>> mycellmat{2,2}='hello'
mycellmat =
  2×2 cell array
    {[       23]}    {'a'    }
    {[1 3 5 7 9]}    {'hello'}

也可以整体赋值:

mycellmat = cellmat
mycellmat =
  2×2 cell array
    {[       23]}    {'a'    }
    {[1 3 5 7 9]}    {'hello'}

{}是cell索引,()是内容索引

cellmat{2,1}
ans =
     1     3     5     7     9
>> cellmat{2,1}(4)
ans =
     7

可以获取子集

cellcolvec{2:3}
ans =
    'a'
ans =
     1     3     5     7     9
或者:
[c1, c2] = cellcolvec{2:3}
c1 =
    'a'
c2 =
     1     3     5     7     9

甚至:

[c1, c2] = cellmat{2:3}
c1 =
     1     3     5     7     9
c2 =
    'a'

4.删除cell array元素

cellrowvec
原始:cellrowvec =
  1×4 cell array
    {[23]}    {'a'}    {[1 3 5 7 9]}    {'hello'}
>> cellrowvec(2)=[]
删除索引为2的元素:cellrowvec =
  1×3 cell array
    {[23]}    {[1 3 5 7 9]}    {'hello'}
>> cellrowvec(2)=[]
再次删除索引为2的元素:cellrowvec =
  1×2 cell array
    {[23]}    {'hello'}

如果是矩阵类型的cell array,矩阵操作依旧能用:

cellmat
数据:cellmat =
  2×2 cell array
    {[       23]}    {'a'    }
    {[1 3 5 7 9]}    {'hello'}
>> cellmat1 = cellmat
准备1:cellmat1 =
  2×2 cell array
    {[       23]}    {'a'    }
    {[1 3 5 7 9]}    {'hello'}
>> cellmat2 = cellmat
准备2:cellmat2 =
  2×2 cell array
    {[       23]}    {'a'    }
    {[1 3 5 7 9]}    {'hello'}
>> cellmat1(1,:)=[]
删除一行:cellmat1 =
  1×2 cell array
    {[1 3 5 7 9]}    {'hello'}
>> cellmat2(:,1)=[]
删除一列:cellmat2 =
  2×1 cell array
    {'a'    }
    {'hello'}

5.cell array中存储string,不同长度

cvnames = {'Sue', 'Cathy', 'Xavier'}
cvnames =
  1×3 cell array
    {'Sue'}    {'Cathy'}    {'Xavier'}

特征:

strlength(cvnames)
每个字符串长度:ans =
     3     5     6
>> size(cvnames)
cell array大小:ans =
     1     3

用string函数将cell array转换成string array

stnames = string(cvnames)
stnames = 
  1×3 string array
    "Sue"    "Cathy"    "Xavier"

与之相反,可以用cellstr函数完成string到cell转换:

 cellstr(stnames)
ans =
  1×3 cell array
    {'Sue'}    {'Cathy'}    {'Xavier'}

字符串处理函数strsplit和strjoin函数,前者是分割,后者是合并:

da = date
da =
    '03-Sep-2022'
>> strsplit(da, '-')
ans =
  1×3 cell array
    {'03'}    {'Sep'}    {'2022'}
>> sd = strsplit(da, '-')
sd =
  1×3 cell array
    {'03'}    {'Sep'}    {'2022'}
>> jd = strjoin(sd, '/')
jd =
    '03/Sep/2022'

判断cell中元素是否为string的函数iscellstr

iscellstr(cvnames)
ans =
  logical
   1
>> iscellstr(cellcolvec)
ans =
  logical
   0

 

posted @ 2022-09-03 11:23  叕叒双又  阅读(667)  评论(0编辑  收藏  举报