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
人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。