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

MATLAB中cell数组的是是非非

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

, V5 ]+ E2 W& K5 y1 e. D* f由于工作需要,经常要处理大量的实验数据.基本都是由仪器导出来,随着社会发展的进步,人们获取数据的量在不断增长,很多人都是,现在已经是海量数据时代了..., z+ o0 G; V( `7 V
从cell使用说起 + ]5 M, y# j+ D( E  i2 k! G
在读取文件的时候,cell数组(各种翻译都有,元胞数组,单元数组...直接无视)是MATLAB的宠儿,基本都会出现,长期使用发现频率比struct高了不少~无论是Import Data还是使用textscan之类来获取数据.从长期使用高级语言的角度来说,特别是习惯了面向对象之后i,更习惯使用struct数组,概念也很相似,奈何现实是...我们先看一下Matlab在help给出的定义:
, k3 p0 M, g& h6 c; LA cell array is a collection of containers called cells in which you can store different types of data.
! F4 g+ ]+ x  P# x! h7 r1 Y
4 |$ f. r! Z. b5 t1 {8 @& v. \精华之处就是在可以存储不同类型的数据.可以是Matlab的类型或者自定义的类型.& j: o% W( b2 H) n
cell数组的一些操作* v, F' A; n& Q2 F- A2 T+ D0 A( P6 k
创建:直接使用{}以及cell(...)形式,另外 下标法赋值也可以.注意后两种可以预配内存,内存是空间连续的~- t, S, p. S4 d8 ~6 K1 X
读取内容:{下标}和(下标)  区别在于类型()是cell数组 ,{}是实际类型.结果显示是一致的
! d3 B  C- {' ?* j) `>> a={'啊',123,[3 5 6],[1 2;7 8],sym(1)}* E$ W# _( B8 A: L6 b; M6 z
a =
- J6 v, b* h, y    '啊'    [123]    [1x3 double]    [2x2 double]    [1x1 sym]
0 p7 T7 M; b; t- @/ ?* ]7 H>> class(a{1})
" F$ i; e  W( o3 R* Nans =
, |% @# I1 ~+ e( kchar/ |# X0 y! d( D
>> class(a(1))
6 |* I( z7 D) ~- A3 Mans =# b5 k- A% D3 R$ g
cell* b9 j! G( @2 s3 b0 G
>>
4 Y. T% X7 [2 G+ xC{5,3}{4,7}(:,4)3 D( u9 r  e% A: e8 j* V
解读: cell数组的一个元素为cell类型,包含一个普通矩阵类型4 S5 v& X! Y" k# \
x = C{5,3};      % x is a cell array
# z; @1 L6 j! O5 z2 `/ N! A" Xy = x{4,7};      % y is also a cell array
9 T1 @# H  ?# gz = y(:,4)       % z is a standard array
. u: L7 X& Y7 x6 r8 Z: Y复制代码
0 O, @+ n* D% L, @$ ?" t8 Y调整内容:添加和删除与普通矩阵方法一致
; f" J; ?: B! K* Y相关函数:( y- G5 H+ j- C8 t
  celldisp:显示所有的内容, Z0 u. A/ u! `2 z% T0 I
cell:创建空的元胞数组
& t' w' r. t! w  cellplot:利用图形方式显示内容
4 [$ Q; i$ Q, n5 \  cell2mat:将数组转变成为普通的矩阵
$ {0 w- ]4 Y. h. J+ @7 J3 M% ^  mat2cell:将数值矩阵转变成为cell数组
: {# C4 T* P) B6 @5 f/ g% p  num2cell:将数值数组转变成为cell数组! D, A; f- P/ O! `1 |6 e) x1 z* h4 Z1 |
  cell2struct:将数组转变成为结构
4 P, \! {- P7 V5 H6 v( E; S  struct2cell:将结构转变为cell数组- y! ~9 S" K6 I5 b. q2 J3 R
  iscell:判断输入是否为cell数组
! X- E7 [. I! R6 m+ q$ Zcellfun:为cell数组的每个cell执行指定的函数 fun可以是特殊函数或者句柄
  h/ J2 I3 U: Ydays{1} = 'Sunday';    days{2} = 'Monday';
6 Q7 g' A8 K. w# Rdays{3} = 'TuESDay';   days{4} = 'Wednesday';7 L7 G  X$ v9 B* ~% x
days{5} = 'Thursday';  days{6} = 'Friday';
$ \8 C" S' p  O1 l' G1 wdays{7} = 'Saturday';
3 a+ s" k3 N# f+ h0 I+ [( h9 o8 E" K+ x" U; ?0 l! C
shortNames = cellfun(@(x)x(1:3), days, 'UniformOutput', false)
8 P- Y2 N! }0 a' y7 d6 N" UshortNames = ; j$ C8 b' O6 v; H% X/ f
    'Sun'    'Mon'    'Tue'    'Wed'    'Thu'    'Fri'    'Sat'7 X; J) p8 Y& R* K
复制代码
" O2 Y8 |2 L, h3 U8 l# s4 ?  `  deal:将输入参数赋值给输出 [Y1, Y2, Y3, ...] = deal(X{:}) ->可以简化[a,b,c,d] = C{:}. R* @8 V# |, w: D8 @- p. c
cell数组的类型转换看到上面的那些类型转换函数,也许你会笑了,感觉也没有什么特别的,但是使用过这个cell数组的朋友,估计大部分都会有转换失败的经历-_-很坑爹的...+ J2 O, }1 X7 i' P4 s) J1 |8 [

  y- I* U+ M# J$ _: z! U. \Cell Array and Struct Array+ n3 P1 l3 p" [$ p
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不对5 O3 A9 v4 H. J# ]0 @! }% i8 [8 m: X( o# {
   c = struct2cell(s)  struct数组转换为cell数组 这个基本没有什么错误的- k: l& D6 Q6 z6 ~. ?5 d) |! p/ R
4 X; `! H* ^7 ^* G  _
Matrix and Cell Array! g& t% ?2 ?" W  n# p& B# c
c = mat2cell(x, m, n) 转换为 m行n列cell数组 m = cell2mat(c) 必须是同一类型,而且限制不可包含cell数组或object类型,但是struct结构是可以的(同样这个struct不含 cell和object类型,否则依旧出错)
" W" @9 l( I  D, f2 O0 H- W
2 M2 i% u3 s- `Double and Cell Array
4 s. p# a5 N/ c7 d0 ]3 W" H7 uC = num2cell(A, [dim1, dim2, ...]) 返回C的维数是numel(A)/prod(X,Y,...)   dimN 是一个整数,范围是1到ndims(A)
" O3 M7 L! e$ }- N  N8 m. K只有数值矩阵才可以直接转换为cell,没有供cell转为double的方法.这是非常让人恼火的!不过理解之后就知道,cell本来就是混合类型的,直接转向数值类型单一矩阵,这样是不合理的.通常如果是的确是数值类型的可以走以下路线:cell->cell2mat 这时候注意cell2mat的条件非cell和object.否则,循环或者cellfun处理.如果可以使用 cell2mat 或者cat(dim,c{:}).很多时候都很方便
7 F: i" f& I' hCell Arrays of Strings , i1 e4 K2 Q0 I
单独列出了是因为很多时候都要接触这个,基本txt之类读取来的数值数据都是char的cell数组~
! S  A+ k* Q6 I' e+ s可以使用cell参数与字符有关的部分函数(基本都支持)
- V) T, k5 n5 R" \4 Hcellstr      Convert a character array to a cell array of strings.会去除末尾空白# ]) @) X# M( x& q# ]
char        Convert a cell array of strings to a character array. 会恢复转换时候失去的空白3 b' W. d# F' Q  |5 F
deblank   Remove trailing blanks from a string.
7 S, ^4 A: \% siscellstr    Return true for acell array of strings.) {6 {- h  `8 o+ o" w5 ]4 p) O) n
sort        排序.) E3 y0 a) t  z% I9 R
strcat连接字符.
* Q$ f( p' R+ l* ustrcmp对比字符.& p6 m2 |  f4 O" j- A
strmatch 查找字符.
9 D7 Z2 b& ]3 ~5 Z9 v8 _3 L; [strrep 替换字符/ N1 D+ l" R( m$ q! B; I
regexp系列及accumarray支持行列向量.
  K8 n* Q$ R% ~0 [$ y# g% o+ a* m$ c0 S5 u/ i& A2 f" k- B% D) K6 X, P
读写
' a6 n# z- h% u数据读取进来了,处理后当然是需要保存的,可是面对要求 你总是很无奈,要是可以.mat格式那个很好啊 可是大部分要求都是txt之类的.(不明白为什么呢 其实数据库之类Matlab也是支持的...唉,需求总是最后的注脚...)首先要了解怎么情况会有cell数组产生:具体查看textscan 的说明.大文件的读取首先推荐这个函数,处理灵活可以省去很多功夫,具体的格式设置很关键!能够有效分离cell数据的结果方便处理~否则3000万个数据循环绝对是out of memory...尽量使用高级的IO读写...另外,7.0很多读取都是数值返回cell的char类型数组 7.6以上都使用double了,包括xlsread...2 L$ e' O& h- W& B7 c2 k5 C8 |: n
如果允许,xlswrite是最好的选择~大量数据测试的结果还是非常好的3 t2 e3 y7 k3 r2 j" A
在Matlab帮助里面的循环例子:
% x% {6 G# W, s$ {. Emycell = { 'a' 1 2 3 ; 'b' 4 5 6 };, k4 }- M8 r. f; V
[nrows,ncols]= size(mycell);
: b6 C) h: h  e' z' b4 qfilename = 'celldata.dat';
% F5 C# ^0 g" ^% V0 _fid = fopen(filename, 'w');
, S, Y5 u+ U3 z. s5 wfor row=1:nrows
+ B# k  D# r' Z0 z; a" V    fprintf(fid, '%s %d %d %d\n', mycell{row,:});
7 R3 w; W& W0 h2 N2 Rend7 m% P# ]' @$ G. \
fclose(fid);( h" N0 N) W0 l8 Y3 S
2 i& Y' A$ L. p* n1 p% N+ d' \
复制代码5 t8 \. c5 D7 i1 @
仅有数值时候 可以考虑先cell2mat 然后csvwrite.
7 S' E' S4 }# K- |- k( i8 }
6 O, q0 A5 w$ M/ ~1 x" o
$ I) x" u( y. X. J* n总结
% b$ y; U5 ], K! K) n% @基本是就是总结了一下用法,特别是转换和保存方面的,相对于struct数组,由于Matlab中支持甚多,因此也就常用了.功能偏弱,但是基本按照规则,还是可以尽量减少出错的.. Z2 {. m% [6 m3 H" j  m% l) h
希望大家也交换一下使用的心得~

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-31 19:45 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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