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

MATLAB中cell数组的是是非非

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

$ d4 R% @0 e, r5 j2 N& x由于工作需要,经常要处理大量的实验数据.基本都是由仪器导出来,随着社会发展的进步,人们获取数据的量在不断增长,很多人都是,现在已经是海量数据时代了...! l% o0 X; e1 s4 Q; k$ Z
从cell使用说起
8 I) [7 S- n/ T2 T  p% R! Q' n在读取文件的时候,cell数组(各种翻译都有,元胞数组,单元数组...直接无视)是MATLAB的宠儿,基本都会出现,长期使用发现频率比struct高了不少~无论是Import Data还是使用textscan之类来获取数据.从长期使用高级语言的角度来说,特别是习惯了面向对象之后i,更习惯使用struct数组,概念也很相似,奈何现实是...我们先看一下Matlab在help给出的定义:
" {  E  n# }" V) HA cell array is a collection of containers called cells in which you can store different types of data.  h/ C+ y+ \$ `  h

. ^  n: l; d6 Z" Q( |, P精华之处就是在可以存储不同类型的数据.可以是Matlab的类型或者自定义的类型.
  F1 s/ v+ j" G$ Fcell数组的一些操作, T' U, y( M6 l2 [
创建:直接使用{}以及cell(...)形式,另外 下标法赋值也可以.注意后两种可以预配内存,内存是空间连续的~7 `  J8 l  L7 i
读取内容:{下标}和(下标)  区别在于类型()是cell数组 ,{}是实际类型.结果显示是一致的
( b- \+ p4 z0 O4 Z6 I$ }$ k>> a={'啊',123,[3 5 6],[1 2;7 8],sym(1)}
# M' ~8 w$ c/ m# c/ O% A' na =
, i" R5 ]" A" x7 p( y    '啊'    [123]    [1x3 double]    [2x2 double]    [1x1 sym]9 \7 g6 I( r+ C; }, [* u0 J
>> class(a{1})
+ \! p  w5 ?/ {) p7 h) lans =
6 \# S5 [/ k& @& ochar2 ]  R. C. w# @: g
>> class(a(1))2 |: O( H7 G, M' U: r( L$ U
ans =
1 Y, N# W+ |3 \8 `  ], g* E% |4 e: bcell
; Q; {' W% i5 S+ V  ~) N. c  z>>
" D+ H; r; H( r$ eC{5,3}{4,7}(:,4)
; c. w: ]# T3 W- [6 J+ P  d解读: cell数组的一个元素为cell类型,包含一个普通矩阵类型8 X  m3 V( K( z/ I
x = C{5,3};      % x is a cell array
8 j0 t" u; \6 u+ \% e, dy = x{4,7};      % y is also a cell array
# z7 ~7 o! e' C, vz = y(:,4)       % z is a standard array+ N5 G. v) s4 I7 r$ b
复制代码
4 R* M, G4 f5 O' R* {调整内容:添加和删除与普通矩阵方法一致. r& X6 c( T! Y1 A9 I, [
相关函数:8 g/ |3 r0 Y& }/ l/ N
  celldisp:显示所有的内容
" g5 n2 B( @. H" y3 Q5 D8 l/ J% qcell:创建空的元胞数组6 F! z/ f# L7 t  ^5 i! q
  cellplot:利用图形方式显示内容$ f) Q4 q$ G, J* H( z
  cell2mat:将数组转变成为普通的矩阵
1 o# p* a+ ]! R6 X% h: w( A  mat2cell:将数值矩阵转变成为cell数组
4 h0 K2 u. L) E3 o& P9 E  num2cell:将数值数组转变成为cell数组' t% p$ t# h3 Z4 c' S% W2 B" V
  cell2struct:将数组转变成为结构
  l& E% x. m4 Z. x  struct2cell:将结构转变为cell数组
5 P3 s/ ~$ i$ s  r$ M  iscell:判断输入是否为cell数组
, M  ?. K" m! d, w' f) Hcellfun:为cell数组的每个cell执行指定的函数 fun可以是特殊函数或者句柄5 Q: {9 e7 o: L& b! E
days{1} = 'Sunday';    days{2} = 'Monday';
6 D6 o. u3 N& _days{3} = 'TuESDay';   days{4} = 'Wednesday';
! J% e; E; o& J% z  {( @4 tdays{5} = 'Thursday';  days{6} = 'Friday';
  j. N' g2 B8 t: k# r0 Tdays{7} = 'Saturday';
! z! V$ \, {7 C( [  f+ G5 q- I# ?, I+ V( x) c, t" n. i1 _
shortNames = cellfun(@(x)x(1:3), days, 'UniformOutput', false). a1 r# y# A! Z3 U5 v
shortNames = * A% z0 f/ A1 p, c* Z
    'Sun'    'Mon'    'Tue'    'Wed'    'Thu'    'Fri'    'Sat'& f; O6 h6 ^! k4 g, a, t
复制代码
: o# Z; D, O2 F9 _( D1 D  deal:将输入参数赋值给输出 [Y1, Y2, Y3, ...] = deal(X{:}) ->可以简化[a,b,c,d] = C{:}
: W) o- B4 W" y5 z9 S; T+ U8 `! m# J" Jcell数组的类型转换看到上面的那些类型转换函数,也许你会笑了,感觉也没有什么特别的,但是使用过这个cell数组的朋友,估计大部分都会有转换失败的经历-_-很坑爹的...
& J/ G. W2 Y8 C. T* Z$ c+ |; ^: w$ {5 L3 q  G
Cell Array and Struct Array
" d* {) Z( r, i. e9 {8 c3 ps = 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不对
" V# n& j  Z( G9 O# ~' V3 H0 J   c = struct2cell(s)  struct数组转换为cell数组 这个基本没有什么错误的7 g/ W# X( d$ }6 N& Z

0 U5 X8 |- _. a3 CMatrix and Cell Array
% }. o: t0 |0 _2 a; `4 ]c = mat2cell(x, m, n) 转换为 m行n列cell数组 m = cell2mat(c) 必须是同一类型,而且限制不可包含cell数组或object类型,但是struct结构是可以的(同样这个struct不含 cell和object类型,否则依旧出错)) D) x4 ?7 u7 U

; H7 ]) y5 C6 }/ m  ADouble and Cell Array) _: q, i2 L% I$ n+ G
C = num2cell(A, [dim1, dim2, ...]) 返回C的维数是numel(A)/prod(X,Y,...)   dimN 是一个整数,范围是1到ndims(A)0 G# I; u  X& W
只有数值矩阵才可以直接转换为cell,没有供cell转为double的方法.这是非常让人恼火的!不过理解之后就知道,cell本来就是混合类型的,直接转向数值类型单一矩阵,这样是不合理的.通常如果是的确是数值类型的可以走以下路线:cell->cell2mat 这时候注意cell2mat的条件非cell和object.否则,循环或者cellfun处理.如果可以使用 cell2mat 或者cat(dim,c{:}).很多时候都很方便
/ [: b1 Z9 j$ v; E! g6 NCell Arrays of Strings
9 t9 Z4 _2 o! F8 n. G单独列出了是因为很多时候都要接触这个,基本txt之类读取来的数值数据都是char的cell数组~
& s: B0 F$ _* }( h+ _- t# g可以使用cell参数与字符有关的部分函数(基本都支持)
' _1 T# L9 b+ ^6 Zcellstr      Convert a character array to a cell array of strings.会去除末尾空白
# U7 y/ N8 T* s' i8 n" lchar        Convert a cell array of strings to a character array. 会恢复转换时候失去的空白
" x  c8 K% ]: m( X& u" w, Udeblank   Remove trailing blanks from a string.$ o( b& N: W; A: p) y$ K- t2 Y9 S
iscellstr    Return true for acell array of strings.
5 @& t3 q( \  F( b1 hsort        排序.
! L% {0 J2 p* M3 A$ rstrcat连接字符.
( H) ^* _& J! C! b, sstrcmp对比字符.! F* `& B% o+ j: @( s
strmatch 查找字符.
4 {3 U7 f: H9 X4 \) Dstrrep 替换字符
4 k, {7 h1 t3 q* F6 _, y0 eregexp系列及accumarray支持行列向量.& T' ^- b5 T/ U8 B' ]6 {! I

" G& p+ y) T# G读写
6 O, u/ _& l3 V4 b" q数据读取进来了,处理后当然是需要保存的,可是面对要求 你总是很无奈,要是可以.mat格式那个很好啊 可是大部分要求都是txt之类的.(不明白为什么呢 其实数据库之类Matlab也是支持的...唉,需求总是最后的注脚...)首先要了解怎么情况会有cell数组产生:具体查看textscan 的说明.大文件的读取首先推荐这个函数,处理灵活可以省去很多功夫,具体的格式设置很关键!能够有效分离cell数据的结果方便处理~否则3000万个数据循环绝对是out of memory...尽量使用高级的IO读写...另外,7.0很多读取都是数值返回cell的char类型数组 7.6以上都使用double了,包括xlsread.../ G; @5 x- F) l' ?# T
如果允许,xlswrite是最好的选择~大量数据测试的结果还是非常好的
3 N: O4 K' Q  ~$ E8 j在Matlab帮助里面的循环例子:
8 o8 d) T9 P7 e  z3 U; ~' F3 C# _mycell = { 'a' 1 2 3 ; 'b' 4 5 6 };
% R( l; G, m7 M7 T0 |9 N[nrows,ncols]= size(mycell);! u2 S2 ]& k2 ~. B: [3 @+ |
filename = 'celldata.dat';
& h: Y/ X/ }" K2 A6 O- N! M0 ^0 H6 gfid = fopen(filename, 'w');: K# k) C) C# F8 Y& q2 l% B$ b  e
for row=1:nrows/ X. d' K' R  ]) e" \+ }9 q
    fprintf(fid, '%s %d %d %d\n', mycell{row,:});: [( P4 @, V4 ^2 X
end5 q; ]$ t& l; R9 n: S* |' t
fclose(fid);" I5 ]3 V" A8 O' Q" O+ N/ N1 j2 b5 L
! C+ b; K- J" R# g- w
复制代码
! M& K* l9 p  e3 @0 E. n仅有数值时候 可以考虑先cell2mat 然后csvwrite.
) K4 I9 E8 b6 j% G# c3 k7 ~$ o8 a) T! _! J  |* f7 m; @- }

8 t' a7 H9 ?2 n6 n! R总结7 d0 Q  ^- V& U
基本是就是总结了一下用法,特别是转换和保存方面的,相对于struct数组,由于Matlab中支持甚多,因此也就常用了.功能偏弱,但是基本按照规则,还是可以尽量减少出错的.( \5 R, D! L7 ?6 w: C
希望大家也交换一下使用的心得~

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-21 01:22 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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