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

MATLAB中cell数组的是是非非

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

. `) C# z1 O5 {+ f由于工作需要,经常要处理大量的实验数据.基本都是由仪器导出来,随着社会发展的进步,人们获取数据的量在不断增长,很多人都是,现在已经是海量数据时代了...6 C" B9 w( V0 z& R' Z' x2 u6 c
从cell使用说起 , G# e9 m9 D" Z7 m1 g# }
在读取文件的时候,cell数组(各种翻译都有,元胞数组,单元数组...直接无视)是MATLAB的宠儿,基本都会出现,长期使用发现频率比struct高了不少~无论是Import Data还是使用textscan之类来获取数据.从长期使用高级语言的角度来说,特别是习惯了面向对象之后i,更习惯使用struct数组,概念也很相似,奈何现实是...我们先看一下Matlab在help给出的定义:% i% p9 x8 P0 E
A cell array is a collection of containers called cells in which you can store different types of data.9 b  J9 O  ?& |. b& M& H

& P! Y1 X' t. i6 ~8 k精华之处就是在可以存储不同类型的数据.可以是Matlab的类型或者自定义的类型.4 J, U7 ]; Z4 _& i
cell数组的一些操作1 M) i4 z+ T: J; A" W
创建:直接使用{}以及cell(...)形式,另外 下标法赋值也可以.注意后两种可以预配内存,内存是空间连续的~' y8 M3 H4 {0 F
读取内容:{下标}和(下标)  区别在于类型()是cell数组 ,{}是实际类型.结果显示是一致的; q0 a6 z4 R0 t8 m9 T4 ]
>> a={'啊',123,[3 5 6],[1 2;7 8],sym(1)}
! d8 q) t; p2 s& R9 z1 O2 a" Ea = + ]7 q$ o' F4 [6 s5 {$ T
    '啊'    [123]    [1x3 double]    [2x2 double]    [1x1 sym]9 j* j# N7 T) Y0 l7 i& W2 u
>> class(a{1})
- f3 t- h% b: J1 h# `+ T( I& gans =5 B0 ]& a" |! G6 {; G% ^) h
char
' }9 j  N2 u; ~' V, }( C$ }>> class(a(1))$ [" I/ q7 b% `; P* a! N1 i$ B9 C
ans =
* R' x& ]3 J% gcell! K1 G5 c9 E' y( [0 a3 ]7 q7 H3 a
>>
. R" `* I" B  ]C{5,3}{4,7}(:,4)
' y! f1 K: g& r解读: cell数组的一个元素为cell类型,包含一个普通矩阵类型
' g5 O1 z$ A# j' ?6 n  M6 A0 `+ Mx = C{5,3};      % x is a cell array
7 L; u' H9 g$ G* Gy = x{4,7};      % y is also a cell array! J2 d: T9 ^0 _
z = y(:,4)       % z is a standard array# t& q3 J* v3 ^
复制代码
- C3 s1 [2 K3 P调整内容:添加和删除与普通矩阵方法一致+ l6 T) ~$ U3 M+ M! S6 @
相关函数:4 b# e1 F' L; d" b9 R8 m9 S4 b. x
  celldisp:显示所有的内容
( V8 f4 z0 @' s; a+ {! ocell:创建空的元胞数组6 F) @6 x. t, K/ W# ]: z* ]
  cellplot:利用图形方式显示内容
* z: K; A9 R2 H  cell2mat:将数组转变成为普通的矩阵" W( c- s7 ?- [; M# ~* T. e
  mat2cell:将数值矩阵转变成为cell数组$ w( {, A3 R% b9 U  t" W
  num2cell:将数值数组转变成为cell数组
) x9 H; }, N$ w. R) Q" E3 P! w  cell2struct:将数组转变成为结构1 Z% Q6 K2 L  G; |0 s
  struct2cell:将结构转变为cell数组
7 _6 j2 J* m- O( D8 D" k  iscell:判断输入是否为cell数组
( D# ?  [9 M( U. W4 @cellfun:为cell数组的每个cell执行指定的函数 fun可以是特殊函数或者句柄
7 W2 z9 u3 }- idays{1} = 'Sunday';    days{2} = 'Monday';
, n; l; M" c- O* p/ R3 \days{3} = 'TuESDay';   days{4} = 'Wednesday';  }% O9 K' n: _$ e! Y# F* \
days{5} = 'Thursday';  days{6} = 'Friday';0 Z+ ?1 }% d6 x  Z0 r( k# P8 N
days{7} = 'Saturday';0 h& i7 I0 s' J) T# ^

. A; g, p& l9 M1 ?6 t$ U$ TshortNames = cellfun(@(x)x(1:3), days, 'UniformOutput', false)
" \/ j/ Y6 X/ V& {3 x& zshortNames =
, R3 t. P0 V) Z, b* h    'Sun'    'Mon'    'Tue'    'Wed'    'Thu'    'Fri'    'Sat'1 U" }+ \* n9 A8 H. ]6 D
复制代码- z" }4 J9 Y) N" C& R
  deal:将输入参数赋值给输出 [Y1, Y2, Y3, ...] = deal(X{:}) ->可以简化[a,b,c,d] = C{:}( X3 x( h( n2 x) |) a) b8 k. W
cell数组的类型转换看到上面的那些类型转换函数,也许你会笑了,感觉也没有什么特别的,但是使用过这个cell数组的朋友,估计大部分都会有转换失败的经历-_-很坑爹的...
3 o: [! a# @$ b( {3 w+ S- c; t1 p. v' u- Q% r. J
Cell Array and Struct Array
5 e0 g/ _* l  s' ls = 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 H' v) H, j9 u. b2 K. R  K   c = struct2cell(s)  struct数组转换为cell数组 这个基本没有什么错误的
* O/ C: n! q5 y' T/ a5 \0 G" t4 y( P7 x1 u$ @# E  A
Matrix and Cell Array
0 E1 d& p7 S8 [8 K" b0 kc = mat2cell(x, m, n) 转换为 m行n列cell数组 m = cell2mat(c) 必须是同一类型,而且限制不可包含cell数组或object类型,但是struct结构是可以的(同样这个struct不含 cell和object类型,否则依旧出错); H3 T* c- c( K! ?6 D
3 g0 Q8 z( K- Y( |9 X, I) ]
Double and Cell Array6 ^6 S  A* V# d5 N$ w6 U
C = num2cell(A, [dim1, dim2, ...]) 返回C的维数是numel(A)/prod(X,Y,...)   dimN 是一个整数,范围是1到ndims(A)1 M: E, `* t' O, I! @
只有数值矩阵才可以直接转换为cell,没有供cell转为double的方法.这是非常让人恼火的!不过理解之后就知道,cell本来就是混合类型的,直接转向数值类型单一矩阵,这样是不合理的.通常如果是的确是数值类型的可以走以下路线:cell->cell2mat 这时候注意cell2mat的条件非cell和object.否则,循环或者cellfun处理.如果可以使用 cell2mat 或者cat(dim,c{:}).很多时候都很方便, l. i! B# D6 G/ w! ?
Cell Arrays of Strings
& K* p8 U, R1 T# I9 s. N) z单独列出了是因为很多时候都要接触这个,基本txt之类读取来的数值数据都是char的cell数组~" w2 j, s4 b0 S2 l
可以使用cell参数与字符有关的部分函数(基本都支持)6 {! K: J# f) R6 y
cellstr      Convert a character array to a cell array of strings.会去除末尾空白
- d8 n" }2 N! T* U0 ^6 e+ bchar        Convert a cell array of strings to a character array. 会恢复转换时候失去的空白$ o% F6 L( G+ B9 d0 y+ M
deblank   Remove trailing blanks from a string.3 n- i) J& Q' k' O* G0 @% y! g+ @. G
iscellstr    Return true for acell array of strings.! p8 l) {. B% A+ F" v
sort        排序.! N  R; V. p# T1 m2 K6 K) A
strcat连接字符.8 j, K4 T2 ]% I  L5 o, ~/ }1 C3 d
strcmp对比字符.
+ F, Z5 S; d3 y3 jstrmatch 查找字符.
3 y+ n- V# l" Mstrrep 替换字符
% b; a' u. \* Y* d3 sregexp系列及accumarray支持行列向量.. S+ @* z8 ?! }& n" _% B

  X8 v; l4 J! e2 E读写4 c  A, e' z  t5 ^" f* X, U
数据读取进来了,处理后当然是需要保存的,可是面对要求 你总是很无奈,要是可以.mat格式那个很好啊 可是大部分要求都是txt之类的.(不明白为什么呢 其实数据库之类Matlab也是支持的...唉,需求总是最后的注脚...)首先要了解怎么情况会有cell数组产生:具体查看textscan 的说明.大文件的读取首先推荐这个函数,处理灵活可以省去很多功夫,具体的格式设置很关键!能够有效分离cell数据的结果方便处理~否则3000万个数据循环绝对是out of memory...尽量使用高级的IO读写...另外,7.0很多读取都是数值返回cell的char类型数组 7.6以上都使用double了,包括xlsread...
9 D1 ~: K8 p/ D如果允许,xlswrite是最好的选择~大量数据测试的结果还是非常好的/ Z+ }2 o6 Q  }1 t* m
在Matlab帮助里面的循环例子:
9 v' L0 `- p* F: E: g1 j( ]3 ^mycell = { 'a' 1 2 3 ; 'b' 4 5 6 };
+ q5 b+ \3 }+ t% o0 s! W$ b( C# q[nrows,ncols]= size(mycell);
! X  |7 H" `3 vfilename = 'celldata.dat';" P2 j- B! ?. V
fid = fopen(filename, 'w');* y! {: T$ _, l% B/ V
for row=1:nrows7 n+ c0 W. {  v3 g1 k: S+ v$ V4 L4 e
    fprintf(fid, '%s %d %d %d\n', mycell{row,:});! p! B$ f7 y2 G! Q+ ~1 V
end3 @- J- q! ]. ^7 ]
fclose(fid);
# H3 s  @8 i$ M6 x& d
' }: V8 @# u+ i7 Z8 p' s" [- U复制代码' A- I& a5 B9 S
仅有数值时候 可以考虑先cell2mat 然后csvwrite.
2 O5 U' R$ F. L# Y
8 ^5 h, G; E$ S, K" D
: E4 v3 u& b; G& `  e6 e总结' X; j, r  S: i' p/ _
基本是就是总结了一下用法,特别是转换和保存方面的,相对于struct数组,由于Matlab中支持甚多,因此也就常用了.功能偏弱,但是基本按照规则,还是可以尽量减少出错的.
2 G$ i( ~- ^# b9 {希望大家也交换一下使用的心得~

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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