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

MATLAB中cell数组的是是非非

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
$ K5 Z0 B! T6 n% ]0 }  r7 \% _
由于工作需要,经常要处理大量的实验数据.基本都是由仪器导出来,随着社会发展的进步,人们获取数据的量在不断增长,很多人都是,现在已经是海量数据时代了...# z' O( d2 W/ Y7 K
从cell使用说起 . E8 i; S( O- \' C
在读取文件的时候,cell数组(各种翻译都有,元胞数组,单元数组...直接无视)是MATLAB的宠儿,基本都会出现,长期使用发现频率比struct高了不少~无论是Import Data还是使用textscan之类来获取数据.从长期使用高级语言的角度来说,特别是习惯了面向对象之后i,更习惯使用struct数组,概念也很相似,奈何现实是...我们先看一下Matlab在help给出的定义:# p0 Z( Q' B$ G. t3 M5 K" k* W) k" U
A cell array is a collection of containers called cells in which you can store different types of data.
# y: m/ i0 c8 {2 I) ?" [( R  x6 J% K4 J. J" g/ F" f" p
精华之处就是在可以存储不同类型的数据.可以是Matlab的类型或者自定义的类型.
) D1 R( c7 _& b+ q! J% |4 ?cell数组的一些操作
, {. y# B0 ~# T" ~- J, E2 a创建:直接使用{}以及cell(...)形式,另外 下标法赋值也可以.注意后两种可以预配内存,内存是空间连续的~
0 R& X2 O% }$ m( p5 J  J读取内容:{下标}和(下标)  区别在于类型()是cell数组 ,{}是实际类型.结果显示是一致的! n' a0 h* w# }; v( ?
>> a={'啊',123,[3 5 6],[1 2;7 8],sym(1)}
5 H+ n; Q% z9 t: ?$ Q% b3 }a = $ M' s# {0 {- f7 i+ x* P& v
    '啊'    [123]    [1x3 double]    [2x2 double]    [1x1 sym]
1 N4 k- F6 S, t; h# ~- ^>> class(a{1})6 U- i* b6 M9 ]( b
ans =* d. m3 S% C' V# k# F
char+ V2 z& ?! {) a! d: e
>> class(a(1))
2 c" \% \" [/ Y  b, A0 aans =
8 I/ l8 e  d* M) x0 q' ~cell4 x2 N0 f6 V6 c, t) a) b! u* m
>>
: V* C% ~: J. mC{5,3}{4,7}(:,4)5 w) Z$ O/ w4 n; C% r8 j0 O
解读: cell数组的一个元素为cell类型,包含一个普通矩阵类型
4 n9 j, K& F- K; \) K# Gx = C{5,3};      % x is a cell array
4 V2 ~" _4 a+ O$ y) Gy = x{4,7};      % y is also a cell array
* N$ n- t, h3 S/ p2 ^z = y(:,4)       % z is a standard array
5 S* H9 K  v/ P( U! r: ^复制代码
. G$ I4 l0 B' Z( x1 s6 ?2 X调整内容:添加和删除与普通矩阵方法一致, x; A7 r$ w! a  K+ V
相关函数:
4 y% a2 ?1 T! B$ a* @  celldisp:显示所有的内容6 y- s9 K9 _- H) Y" C
cell:创建空的元胞数组3 J0 @5 y* y1 R6 Z% j
  cellplot:利用图形方式显示内容
, O- R5 c1 n+ G* ^0 Z: |  cell2mat:将数组转变成为普通的矩阵2 r; z+ m! g; `, C
  mat2cell:将数值矩阵转变成为cell数组1 n5 ^4 P; B/ W  [; s; J+ p
  num2cell:将数值数组转变成为cell数组
' I1 j& j4 }0 ~0 q; ~! e  cell2struct:将数组转变成为结构/ A4 i8 s' n) E  h: z8 _
  struct2cell:将结构转变为cell数组/ W& K4 [" E6 q
  iscell:判断输入是否为cell数组, k, C+ F" }) T6 D3 p0 l# e; t
cellfun:为cell数组的每个cell执行指定的函数 fun可以是特殊函数或者句柄
3 P1 r# L3 S; [4 p  vdays{1} = 'Sunday';    days{2} = 'Monday';+ G- X3 v! I8 k9 Z! W8 x2 C
days{3} = 'TuESDay';   days{4} = 'Wednesday';
5 n' p' K* @7 Udays{5} = 'Thursday';  days{6} = 'Friday';
# p" Q- a; U! }- @9 udays{7} = 'Saturday';) |8 b& Z, i& m
, k& x5 u( [% T7 R& `, q9 _
shortNames = cellfun(@(x)x(1:3), days, 'UniformOutput', false)
. W2 K; R! Z! O5 i; h: qshortNames =
) K/ D% T* l9 w. R5 G1 V) G    'Sun'    'Mon'    'Tue'    'Wed'    'Thu'    'Fri'    'Sat'
7 T% {2 U6 _: Y* n9 w$ e复制代码
: B' H5 A* s! p, j+ k7 t' W  deal:将输入参数赋值给输出 [Y1, Y2, Y3, ...] = deal(X{:}) ->可以简化[a,b,c,d] = C{:}9 W% I5 Q% }" J
cell数组的类型转换看到上面的那些类型转换函数,也许你会笑了,感觉也没有什么特别的,但是使用过这个cell数组的朋友,估计大部分都会有转换失败的经历-_-很坑爹的...  N, @; m) W, C$ z  R4 f

  T& D) S& p7 ^  T+ n0 e( j5 fCell Array and Struct Array9 X5 q) H7 G2 {% r& G
s = 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不对
& U, t6 x+ F! o1 t9 M* B- I   c = struct2cell(s)  struct数组转换为cell数组 这个基本没有什么错误的. ~# x1 o9 J$ ]& [" @+ V

& m7 m4 l& A8 }$ fMatrix and Cell Array
' M; ~& v# ]' A* j9 H" F6 q4 n( uc = mat2cell(x, m, n) 转换为 m行n列cell数组 m = cell2mat(c) 必须是同一类型,而且限制不可包含cell数组或object类型,但是struct结构是可以的(同样这个struct不含 cell和object类型,否则依旧出错)
  V- F+ P3 `. `/ {& Y
+ v4 y- ]/ {) S$ |% YDouble and Cell Array
" f; x: ]/ ]! S1 R8 j) EC = num2cell(A, [dim1, dim2, ...]) 返回C的维数是numel(A)/prod(X,Y,...)   dimN 是一个整数,范围是1到ndims(A)) |- z2 Z- L8 |# w! {0 h/ W
只有数值矩阵才可以直接转换为cell,没有供cell转为double的方法.这是非常让人恼火的!不过理解之后就知道,cell本来就是混合类型的,直接转向数值类型单一矩阵,这样是不合理的.通常如果是的确是数值类型的可以走以下路线:cell->cell2mat 这时候注意cell2mat的条件非cell和object.否则,循环或者cellfun处理.如果可以使用 cell2mat 或者cat(dim,c{:}).很多时候都很方便. i( _  c0 p- f6 F: s+ V, P- A
Cell Arrays of Strings 3 m/ ]2 ~9 c4 Z0 ^9 G, z
单独列出了是因为很多时候都要接触这个,基本txt之类读取来的数值数据都是char的cell数组~
- _; `+ a- V% B; O可以使用cell参数与字符有关的部分函数(基本都支持)" t) o% A( U4 g) ]9 u
cellstr      Convert a character array to a cell array of strings.会去除末尾空白8 G+ K0 n  e" b4 o6 }' U' @* Q
char        Convert a cell array of strings to a character array. 会恢复转换时候失去的空白: {8 e1 `/ H* a: j
deblank   Remove trailing blanks from a string.) E' b6 k, m$ M" ?1 g% A. N
iscellstr    Return true for acell array of strings.' m. K0 L8 [: p# C
sort        排序.- n) O& b; i/ I5 Z) K, d
strcat连接字符.  |" H0 a* a+ Q! w: E9 T
strcmp对比字符.
; o# o* x6 l# ]- v/ y, hstrmatch 查找字符./ \6 u  E# v0 w. [. q% l
strrep 替换字符/ T! x9 w( f7 z. X- S6 i- o; S4 I
regexp系列及accumarray支持行列向量.4 H* Y  s# `  O

& s! u( w  c5 x% }读写* K5 F2 c6 Y5 \0 u
数据读取进来了,处理后当然是需要保存的,可是面对要求 你总是很无奈,要是可以.mat格式那个很好啊 可是大部分要求都是txt之类的.(不明白为什么呢 其实数据库之类Matlab也是支持的...唉,需求总是最后的注脚...)首先要了解怎么情况会有cell数组产生:具体查看textscan 的说明.大文件的读取首先推荐这个函数,处理灵活可以省去很多功夫,具体的格式设置很关键!能够有效分离cell数据的结果方便处理~否则3000万个数据循环绝对是out of memory...尽量使用高级的IO读写...另外,7.0很多读取都是数值返回cell的char类型数组 7.6以上都使用double了,包括xlsread...9 U1 n4 Y- j% m: U0 F4 O& A
如果允许,xlswrite是最好的选择~大量数据测试的结果还是非常好的
" d8 n) x: W0 _" I% `# t在Matlab帮助里面的循环例子:0 `  Y8 {. K+ [) s
mycell = { 'a' 1 2 3 ; 'b' 4 5 6 };
( m) W, T. n- x9 E[nrows,ncols]= size(mycell);
4 F3 Y. k/ j# o( z5 k6 {+ Lfilename = 'celldata.dat';
$ a4 t. E& [9 lfid = fopen(filename, 'w');
# J1 A) Q8 }: W7 F3 A- |for row=1:nrows
+ z, V, X8 |2 U& a2 I  G( n$ ~    fprintf(fid, '%s %d %d %d\n', mycell{row,:});6 @$ U4 b; s' ]" Q9 \; u3 @
end
" d: W% \; ]# C6 Q6 r, Ofclose(fid);/ r8 z  J7 k2 c' V  d% ]

7 p/ u9 [7 f" @2 q1 F2 R. F( U/ d复制代码# v1 [3 S7 {$ s
仅有数值时候 可以考虑先cell2mat 然后csvwrite.
- R+ Y% A7 d9 W6 @
6 [( a' t# Q1 v% [( U% c! f, g; [% z! J" h
总结
9 b1 m( Y1 l8 V/ i( g; d5 p基本是就是总结了一下用法,特别是转换和保存方面的,相对于struct数组,由于Matlab中支持甚多,因此也就常用了.功能偏弱,但是基本按照规则,还是可以尽量减少出错的.7 ]* p  P& T. m' e# K
希望大家也交换一下使用的心得~

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 01:30 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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