找回密码
 注册
关于网站域名变更的通知
查看: 458|回复: 1
打印 上一主题 下一主题

MATLAB中cell数组的是是非非

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-12-28 17:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
. B7 A% x* I) Q' N' T) S5 Z
由于工作需要,经常要处理大量的实验数据.基本都是由仪器导出来,随着社会发展的进步,人们获取数据的量在不断增长,很多人都是,现在已经是海量数据时代了...
2 H# U! l% ^8 T8 m从cell使用说起
1 j7 b/ h# Q$ C: d在读取文件的时候,cell数组(各种翻译都有,元胞数组,单元数组...直接无视)是MATLAB的宠儿,基本都会出现,长期使用发现频率比struct高了不少~无论是Import Data还是使用textscan之类来获取数据.从长期使用高级语言的角度来说,特别是习惯了面向对象之后i,更习惯使用struct数组,概念也很相似,奈何现实是...我们先看一下Matlab在help给出的定义:! i, d) D, p+ o' }9 n
A cell array is a collection of containers called cells in which you can store different types of data.) }- u) {6 z$ d, G! t

9 J5 A5 Z6 [  X2 p+ r' ]2 f0 m精华之处就是在可以存储不同类型的数据.可以是Matlab的类型或者自定义的类型.% r( ]5 \4 G' r( H' d+ r7 U; Y) D
cell数组的一些操作) h/ p* z: s+ v+ i- j8 Y
创建:直接使用{}以及cell(...)形式,另外 下标法赋值也可以.注意后两种可以预配内存,内存是空间连续的~* e! T2 b1 T5 g6 O
读取内容:{下标}和(下标)  区别在于类型()是cell数组 ,{}是实际类型.结果显示是一致的
2 c5 f6 F5 R) C6 X7 b' E>> a={'啊',123,[3 5 6],[1 2;7 8],sym(1)}
4 U3 }$ G+ N) Y2 i+ N/ _- ]a = 6 c; S0 H- z; g
    '啊'    [123]    [1x3 double]    [2x2 double]    [1x1 sym]4 \8 W+ S( U+ A. y/ z
>> class(a{1})/ K9 K- E0 A+ P- {0 q3 I
ans =7 U" T) R6 Q! {6 T5 f8 {
char0 G) z8 }3 d0 o9 y3 W+ p6 a
>> class(a(1))
# G7 D! E3 v6 wans =
9 p) V- B$ _6 ?6 L! Jcell8 ~4 C. E" k2 P( o- ?% l
>> " ?- w7 N3 c: G4 ~/ S
C{5,3}{4,7}(:,4)
0 v/ }  J& d1 Z% h' m解读: cell数组的一个元素为cell类型,包含一个普通矩阵类型
9 f. ~/ s2 @) D7 yx = C{5,3};      % x is a cell array$ `% i/ [+ D8 }* P3 O& w
y = x{4,7};      % y is also a cell array8 N# \5 `: \9 S- m
z = y(:,4)       % z is a standard array, O0 @' c: H+ T% f
复制代码
4 j7 @7 Y2 }5 z, [  g4 p, x调整内容:添加和删除与普通矩阵方法一致8 B3 w* z9 R9 x
相关函数:
6 ^/ z7 u; D' @4 {+ P  celldisp:显示所有的内容
7 a- n" F# m1 W6 ucell:创建空的元胞数组1 a0 z# m  k3 \) w& v% v* _
  cellplot:利用图形方式显示内容& h# {9 Q# s# }8 }. M
  cell2mat:将数组转变成为普通的矩阵
9 V2 c9 `1 f5 y6 M( b  mat2cell:将数值矩阵转变成为cell数组
3 v. T, ^3 t: W% R  num2cell:将数值数组转变成为cell数组9 y4 Y* H) ]! b& D! L$ ?
  cell2struct:将数组转变成为结构
* a3 c  z7 i. \8 e: \, W. o: O  struct2cell:将结构转变为cell数组
  _) X3 W7 J8 y, d6 z  iscell:判断输入是否为cell数组
0 E( f  {, |4 c' Y0 o# m$ Ncellfun:为cell数组的每个cell执行指定的函数 fun可以是特殊函数或者句柄
" T* e# W& Z! S# ^9 Bdays{1} = 'Sunday';    days{2} = 'Monday';" I; B$ X9 D0 G5 D2 O/ f6 M/ ~
days{3} = 'TuESDay';   days{4} = 'Wednesday';
4 r9 X9 W% ?* K2 m5 ddays{5} = 'Thursday';  days{6} = 'Friday';- [# |1 e" Y. |1 M8 ?0 A
days{7} = 'Saturday';* q& D/ O2 E. H7 o" C- P1 t
! g5 g- [. T& l* P( C$ L
shortNames = cellfun(@(x)x(1:3), days, 'UniformOutput', false)
  {& n/ H1 H* V& sshortNames =
6 I5 T# ^8 V& L! v    'Sun'    'Mon'    'Tue'    'Wed'    'Thu'    'Fri'    'Sat'
- W& l" B% g' g6 r' C) X复制代码
7 e$ s% H6 J3 V, D$ L' c/ w, n  deal:将输入参数赋值给输出 [Y1, Y2, Y3, ...] = deal(X{:}) ->可以简化[a,b,c,d] = C{:}. A2 a1 v" [- s: S9 B1 }8 D8 W
cell数组的类型转换看到上面的那些类型转换函数,也许你会笑了,感觉也没有什么特别的,但是使用过这个cell数组的朋友,估计大部分都会有转换失败的经历-_-很坑爹的...6 Q2 M; ]4 w6 `
! v0 e! O# y/ q
Cell Array and Struct Array
) J+ k" X5 l; s6 p) {# P( Ws = 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不对5 v3 }  p8 W0 M) H4 a
   c = struct2cell(s)  struct数组转换为cell数组 这个基本没有什么错误的8 t) V/ ?- \: U4 \1 O( z1 K

- D' [- x$ A8 w' N4 R4 K. R& oMatrix and Cell Array2 [% E) A+ E, D0 @: A
c = mat2cell(x, m, n) 转换为 m行n列cell数组 m = cell2mat(c) 必须是同一类型,而且限制不可包含cell数组或object类型,但是struct结构是可以的(同样这个struct不含 cell和object类型,否则依旧出错)
( ~7 }. X) m: Y. U, k0 W7 |4 z+ T
Double and Cell Array
) G% H% U5 u7 p  g: MC = num2cell(A, [dim1, dim2, ...]) 返回C的维数是numel(A)/prod(X,Y,...)   dimN 是一个整数,范围是1到ndims(A); z, A; R; d- S$ Q# ]8 g. p
只有数值矩阵才可以直接转换为cell,没有供cell转为double的方法.这是非常让人恼火的!不过理解之后就知道,cell本来就是混合类型的,直接转向数值类型单一矩阵,这样是不合理的.通常如果是的确是数值类型的可以走以下路线:cell->cell2mat 这时候注意cell2mat的条件非cell和object.否则,循环或者cellfun处理.如果可以使用 cell2mat 或者cat(dim,c{:}).很多时候都很方便7 V" ~9 Q+ P4 F- ]& c' g+ p9 t1 g
Cell Arrays of Strings
1 Y7 m" n. M4 D单独列出了是因为很多时候都要接触这个,基本txt之类读取来的数值数据都是char的cell数组~
+ g- ]. }# E3 E& w* h可以使用cell参数与字符有关的部分函数(基本都支持)3 Q! h9 D# [  i" E
cellstr      Convert a character array to a cell array of strings.会去除末尾空白$ x0 g" ^: o2 M" L% L( \
char        Convert a cell array of strings to a character array. 会恢复转换时候失去的空白
& [( u  M% F2 j2 L# Pdeblank   Remove trailing blanks from a string.
1 d6 [* S" @) s9 W+ C( biscellstr    Return true for acell array of strings.* \5 `9 [: Y5 o* i7 ?
sort        排序.* F* t: P0 r* x4 D/ i0 C
strcat连接字符.1 e  |. C. k1 D- n1 s5 R3 t+ a# K
strcmp对比字符., e; @7 o+ Q7 _  o
strmatch 查找字符.
  @! k, _. E% d4 M0 j, jstrrep 替换字符* X, p9 P8 e: Y3 ]
regexp系列及accumarray支持行列向量.' o# |3 \8 Q4 B) f
6 @3 T& M* d4 i3 W/ m6 l
读写
3 \' K+ v- E6 Z5 V数据读取进来了,处理后当然是需要保存的,可是面对要求 你总是很无奈,要是可以.mat格式那个很好啊 可是大部分要求都是txt之类的.(不明白为什么呢 其实数据库之类Matlab也是支持的...唉,需求总是最后的注脚...)首先要了解怎么情况会有cell数组产生:具体查看textscan 的说明.大文件的读取首先推荐这个函数,处理灵活可以省去很多功夫,具体的格式设置很关键!能够有效分离cell数据的结果方便处理~否则3000万个数据循环绝对是out of memory...尽量使用高级的IO读写...另外,7.0很多读取都是数值返回cell的char类型数组 7.6以上都使用double了,包括xlsread...
2 w& G% s0 j7 |7 I1 v2 A" |# |9 g如果允许,xlswrite是最好的选择~大量数据测试的结果还是非常好的: F7 G, Y: C4 z$ N3 l4 s$ P- l
在Matlab帮助里面的循环例子:' x3 T, t& J( K4 a9 k
mycell = { 'a' 1 2 3 ; 'b' 4 5 6 };
$ y/ l( q; r9 ]9 Y- W9 w[nrows,ncols]= size(mycell);! i8 X  z$ r0 P
filename = 'celldata.dat';. H+ D# ^3 `; ]0 F* p& S8 u
fid = fopen(filename, 'w');0 T/ a2 N+ U% I; z, t
for row=1:nrows3 e9 d" Y2 F8 m
    fprintf(fid, '%s %d %d %d\n', mycell{row,:});
0 ]6 U  }; l) ], y+ X* Xend# c/ I9 D& e) y$ z, t, y
fclose(fid);
; A8 M. F  S+ D; c& o! r" q" d. Y4 T3 G5 `" c: H2 B
复制代码
0 |" }+ t/ s* \4 N仅有数值时候 可以考虑先cell2mat 然后csvwrite.0 e4 q. F5 h4 K* m$ T" g& [

- k; F: q  d/ A) F  q9 [
1 }. S: z- n% N0 X) e总结
6 V% y. b* h" |4 k+ O! x' D7 ^基本是就是总结了一下用法,特别是转换和保存方面的,相对于struct数组,由于Matlab中支持甚多,因此也就常用了.功能偏弱,但是基本按照规则,还是可以尽量减少出错的.' v. u9 ^+ S0 I) J2 f; O4 I- h* _1 e
希望大家也交换一下使用的心得~

该用户从未签到

2#
发表于 2020-12-28 19:07 | 只看该作者
MATLAB中cell数组的是是非非
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-1 16:14 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表