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

MATLAB中cell数组的是是非非

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
! c3 e) d. n$ |6 i* C- S& ~) `
由于工作需要,经常要处理大量的实验数据.基本都是由仪器导出来,随着社会发展的进步,人们获取数据的量在不断增长,很多人都是,现在已经是海量数据时代了...3 X2 T0 o9 F. ?( O- j& g. x/ y
从cell使用说起 + Y7 e" K* A) d
在读取文件的时候,cell数组(各种翻译都有,元胞数组,单元数组...直接无视)是MATLAB的宠儿,基本都会出现,长期使用发现频率比struct高了不少~无论是Import Data还是使用textscan之类来获取数据.从长期使用高级语言的角度来说,特别是习惯了面向对象之后i,更习惯使用struct数组,概念也很相似,奈何现实是...我们先看一下Matlab在help给出的定义:8 i- D; w. ^) z- V% b/ c- q
A cell array is a collection of containers called cells in which you can store different types of data./ K3 H' c! A: N/ ]8 e# o4 W% F

  C: |- A  P6 v3 U- f% _9 O! X) [精华之处就是在可以存储不同类型的数据.可以是Matlab的类型或者自定义的类型.
: z8 H' r& X; [: m7 s' [6 ]cell数组的一些操作9 T6 q1 |" I9 ?% D- H+ f
创建:直接使用{}以及cell(...)形式,另外 下标法赋值也可以.注意后两种可以预配内存,内存是空间连续的~& l- G- Q1 E) _5 R$ _
读取内容:{下标}和(下标)  区别在于类型()是cell数组 ,{}是实际类型.结果显示是一致的% [& I; z* ?, v# M8 U
>> a={'啊',123,[3 5 6],[1 2;7 8],sym(1)}2 N& z" Z- [7 W1 [& l9 ?; a
a =
% g! n1 ^/ f+ z% B# P( s, \    '啊'    [123]    [1x3 double]    [2x2 double]    [1x1 sym]3 U1 d6 X( ?3 N8 E: i
>> class(a{1})
6 }8 |# b+ G: M1 v6 T* p3 ?ans =
/ n. X: X' D/ g0 {' s! dchar' X* L9 F& g! K: d& M! j! |
>> class(a(1))& a+ A9 q$ {& N# ~; I  B8 u8 ]5 ]2 G
ans =* L  M% o" V$ E$ T  P: N( L, R
cell
' I. g* n+ F$ h# E. R1 V* a) o>> . G# w& P2 X/ u
C{5,3}{4,7}(:,4)
6 i+ @8 ~& T+ {9 u1 k! E0 _) z解读: cell数组的一个元素为cell类型,包含一个普通矩阵类型' K2 O! {' h" ?* B5 v
x = C{5,3};      % x is a cell array
- V5 M+ S, S2 l, \% }7 zy = x{4,7};      % y is also a cell array
& J9 J- G# V1 q, O4 D( y! Bz = y(:,4)       % z is a standard array
5 V& q8 U8 h/ P复制代码' k) Z0 N2 a+ b* Q0 T
调整内容:添加和删除与普通矩阵方法一致7 _: n4 M, B( U
相关函数:, d+ N; G* s4 \8 K
  celldisp:显示所有的内容; L; R8 D( D% h
cell:创建空的元胞数组0 U" I3 h" g5 H& w
  cellplot:利用图形方式显示内容7 [( l2 w" [( o! s8 x6 Z5 l
  cell2mat:将数组转变成为普通的矩阵
, L8 j+ X: K0 z* c/ s- N, x+ F; {  f, ^  mat2cell:将数值矩阵转变成为cell数组
+ q1 }1 b6 q* N' D2 L3 ^* v4 N& B$ H2 d  num2cell:将数值数组转变成为cell数组) i! @6 E. t9 P5 t& V& i# Y: {
  cell2struct:将数组转变成为结构/ O6 T0 m% S8 a% S: \
  struct2cell:将结构转变为cell数组
$ n- i3 S3 ?* O, z: t9 A4 M; S$ K  iscell:判断输入是否为cell数组
( `/ o% F& a1 a, T- Z( E/ Kcellfun:为cell数组的每个cell执行指定的函数 fun可以是特殊函数或者句柄; e( c& q3 C+ G0 R# w' `- i
days{1} = 'Sunday';    days{2} = 'Monday';' d( l; X& c8 e2 |8 o
days{3} = 'TuESDay';   days{4} = 'Wednesday';' y8 F5 [; C8 m( z( p8 x
days{5} = 'Thursday';  days{6} = 'Friday';' K" [' A% u2 T3 W  V1 a9 P
days{7} = 'Saturday';+ e3 R; _' b& W5 Z  [
8 g% D& p1 i8 v% i. r+ _0 [, S  d
shortNames = cellfun(@(x)x(1:3), days, 'UniformOutput', false)
9 l; g8 C& c$ J) d3 oshortNames = 8 }. f  c; P; _; q/ U9 V, X/ i4 [
    'Sun'    'Mon'    'Tue'    'Wed'    'Thu'    'Fri'    'Sat'
" a* q# t6 @  T+ a1 g3 H& _复制代码
' W- r; Y5 Z+ y, P  deal:将输入参数赋值给输出 [Y1, Y2, Y3, ...] = deal(X{:}) ->可以简化[a,b,c,d] = C{:}
. F" {+ \" [0 I4 Mcell数组的类型转换看到上面的那些类型转换函数,也许你会笑了,感觉也没有什么特别的,但是使用过这个cell数组的朋友,估计大部分都会有转换失败的经历-_-很坑爹的...! V1 ]; ]+ ?4 l& e& R
" }, g. h/ z1 ]/ r& m
Cell Array and Struct Array
! @! K% j- ~" l, L' }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不对* O2 d; ^1 F' K3 {- J
   c = struct2cell(s)  struct数组转换为cell数组 这个基本没有什么错误的
' L' R3 q) h( X* q; g* e
2 T7 h+ L/ I# T% kMatrix and Cell Array
. |! m: f$ F7 T9 {, I4 m, ~; r( @c = mat2cell(x, m, n) 转换为 m行n列cell数组 m = cell2mat(c) 必须是同一类型,而且限制不可包含cell数组或object类型,但是struct结构是可以的(同样这个struct不含 cell和object类型,否则依旧出错)
: K$ Q& ~( i, J, L) q. }8 U. r. l$ T. v2 A
Double and Cell Array
. Q4 W3 f' Q; }: cC = num2cell(A, [dim1, dim2, ...]) 返回C的维数是numel(A)/prod(X,Y,...)   dimN 是一个整数,范围是1到ndims(A)' O" J: T8 F% z
只有数值矩阵才可以直接转换为cell,没有供cell转为double的方法.这是非常让人恼火的!不过理解之后就知道,cell本来就是混合类型的,直接转向数值类型单一矩阵,这样是不合理的.通常如果是的确是数值类型的可以走以下路线:cell->cell2mat 这时候注意cell2mat的条件非cell和object.否则,循环或者cellfun处理.如果可以使用 cell2mat 或者cat(dim,c{:}).很多时候都很方便
* V5 w8 Q* Q$ h! MCell Arrays of Strings
( ~$ G5 [9 E9 h! L  K1 `% N( s单独列出了是因为很多时候都要接触这个,基本txt之类读取来的数值数据都是char的cell数组~
! D) ?( p# G0 P$ h可以使用cell参数与字符有关的部分函数(基本都支持)
. R: O$ |9 _" o7 v9 j0 Ncellstr      Convert a character array to a cell array of strings.会去除末尾空白: h. k4 {% b. P; R8 j; G
char        Convert a cell array of strings to a character array. 会恢复转换时候失去的空白
2 T" i; o, D5 wdeblank   Remove trailing blanks from a string., v6 b: \2 V5 `3 u1 g
iscellstr    Return true for acell array of strings.
* V1 }' P0 R: Rsort        排序.+ M( G+ V( v) c& b2 g4 F/ K% Q
strcat连接字符.
' k: [2 k2 M  Hstrcmp对比字符.: H+ O# f6 F# P$ Z7 d
strmatch 查找字符./ u# x+ [5 Z! F0 X0 j
strrep 替换字符* \: x* D4 U6 h; c
regexp系列及accumarray支持行列向量.: d- J$ i; O( w) R( Z
1 W. k5 X2 [  l$ f, o; u
读写& P+ C) C  i9 h. x
数据读取进来了,处理后当然是需要保存的,可是面对要求 你总是很无奈,要是可以.mat格式那个很好啊 可是大部分要求都是txt之类的.(不明白为什么呢 其实数据库之类Matlab也是支持的...唉,需求总是最后的注脚...)首先要了解怎么情况会有cell数组产生:具体查看textscan 的说明.大文件的读取首先推荐这个函数,处理灵活可以省去很多功夫,具体的格式设置很关键!能够有效分离cell数据的结果方便处理~否则3000万个数据循环绝对是out of memory...尽量使用高级的IO读写...另外,7.0很多读取都是数值返回cell的char类型数组 7.6以上都使用double了,包括xlsread...* R+ K; O0 |8 T& \; i1 p$ z. k
如果允许,xlswrite是最好的选择~大量数据测试的结果还是非常好的# V, x# \1 D: a0 b& R, G5 \2 L
在Matlab帮助里面的循环例子:
: T0 D4 e7 e  s# D; u# Imycell = { 'a' 1 2 3 ; 'b' 4 5 6 };
4 z: [1 z2 G( L: N) I% O[nrows,ncols]= size(mycell);- G6 A% I& E/ ^' h5 p, ?4 X2 Z
filename = 'celldata.dat';( S+ i$ X7 o# G! g/ ~  \: U
fid = fopen(filename, 'w');
/ ?* h9 Q5 {5 f- V2 W, nfor row=1:nrows! Z+ n: P5 W) t) Y$ w
    fprintf(fid, '%s %d %d %d\n', mycell{row,:});: ?% v. |. b% N/ J! |" _9 t
end
& L; \5 |- A' k# g0 e$ Bfclose(fid);% }8 c3 P% r$ K8 m9 ^

' q* k& h* W# _+ |2 \/ ~复制代码9 N/ h5 S4 \" ?" i- Y: b0 g  c9 F
仅有数值时候 可以考虑先cell2mat 然后csvwrite.$ b- e5 r: B5 _

' A3 ~7 G7 @/ s/ t; V4 W8 ?+ e" Y, E- l
总结- d9 t; J8 i% q( B% o4 c
基本是就是总结了一下用法,特别是转换和保存方面的,相对于struct数组,由于Matlab中支持甚多,因此也就常用了.功能偏弱,但是基本按照规则,还是可以尽量减少出错的.
6 {* m% T5 W  I' u) A希望大家也交换一下使用的心得~

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-1 05:59 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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