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

MATLAB中cell数组的是是非非

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
# S, q/ J" l7 J  j! Q1 M2 f  J
由于工作需要,经常要处理大量的实验数据.基本都是由仪器导出来,随着社会发展的进步,人们获取数据的量在不断增长,很多人都是,现在已经是海量数据时代了...3 C( i; y! w2 c" [* B; W: A
从cell使用说起
* C' T2 x  }  h+ G1 Q* o; e$ O: s% T在读取文件的时候,cell数组(各种翻译都有,元胞数组,单元数组...直接无视)是MATLAB的宠儿,基本都会出现,长期使用发现频率比struct高了不少~无论是Import Data还是使用textscan之类来获取数据.从长期使用高级语言的角度来说,特别是习惯了面向对象之后i,更习惯使用struct数组,概念也很相似,奈何现实是...我们先看一下Matlab在help给出的定义:
' A: n9 T7 r$ ^0 qA cell array is a collection of containers called cells in which you can store different types of data.
8 ~# D8 n+ Q/ c9 ?$ k
8 u8 Q) }" M6 Y6 }' ?8 C8 e' S; s精华之处就是在可以存储不同类型的数据.可以是Matlab的类型或者自定义的类型.9 k1 B" k( P2 Z0 }4 X
cell数组的一些操作
$ m7 a& O" i) w) E* |1 q9 K% k创建:直接使用{}以及cell(...)形式,另外 下标法赋值也可以.注意后两种可以预配内存,内存是空间连续的~
" m0 k; {4 [  R2 C读取内容:{下标}和(下标)  区别在于类型()是cell数组 ,{}是实际类型.结果显示是一致的6 \- w: O" A$ E
>> a={'啊',123,[3 5 6],[1 2;7 8],sym(1)}
( I/ ?1 w; w. f, W! ?, @a =
" |/ n- u- F( f# q& v3 N2 _    '啊'    [123]    [1x3 double]    [2x2 double]    [1x1 sym]0 Z: W) v, b# N
>> class(a{1})9 ^0 d/ P; @! K0 t; w9 k$ N
ans =/ `7 S! E  @4 z3 Y$ ~  W
char
0 [# G1 R& y/ m3 x  y- M>> class(a(1))0 r# R& L$ n$ t
ans =7 E  H9 A' o0 @* G1 W
cell" j& H5 Q+ ]( |! a8 e+ a- t# \- v
>> 7 s: L# c* z6 u+ O4 s
C{5,3}{4,7}(:,4)
4 q( l: c, R! t, X: S+ h5 P解读: cell数组的一个元素为cell类型,包含一个普通矩阵类型$ J/ n/ Z( a6 L* F
x = C{5,3};      % x is a cell array; \, i, g' b$ ]7 h! m  M" h
y = x{4,7};      % y is also a cell array
8 {8 r; ]" j9 J: Uz = y(:,4)       % z is a standard array
5 r: f' l7 ^! u- q" P复制代码6 L8 S& ?3 ]! p( B# ?+ `: s& ~8 k
调整内容:添加和删除与普通矩阵方法一致- x% q' y) i$ k0 R* b- A! W
相关函数:
7 P3 Q9 t3 |6 ~0 C% q+ O5 {! g' ]7 I  celldisp:显示所有的内容
& ]) }( b& M& v/ n$ m- bcell:创建空的元胞数组
% s; f) r2 q$ u/ ^3 z' W3 P0 Q, S  cellplot:利用图形方式显示内容# `2 j' ^* v7 v' t
  cell2mat:将数组转变成为普通的矩阵" b, r0 B7 Z  I1 t' V! u
  mat2cell:将数值矩阵转变成为cell数组
" U/ ?  \0 F; ], e  num2cell:将数值数组转变成为cell数组) X  B% V2 G' N
  cell2struct:将数组转变成为结构
, O; W1 U" |+ R1 U$ v  struct2cell:将结构转变为cell数组
, C+ P4 b1 d1 o" e( x* f; L. k; b  iscell:判断输入是否为cell数组
; Y4 _( M) m  ^- h5 p. D; ^cellfun:为cell数组的每个cell执行指定的函数 fun可以是特殊函数或者句柄
' M  [% V- j; J- O5 m7 c0 Z7 pdays{1} = 'Sunday';    days{2} = 'Monday';
3 D) p& H2 z2 P  U8 d+ adays{3} = 'TuESDay';   days{4} = 'Wednesday';
/ n: h' o' w5 M: a3 m$ K1 C/ \days{5} = 'Thursday';  days{6} = 'Friday';8 J! T0 j/ ?2 A
days{7} = 'Saturday';
( f5 w' I+ a. F# A; a) h! v6 e# V% F0 {6 u+ H; p0 ^6 Q% U% o
shortNames = cellfun(@(x)x(1:3), days, 'UniformOutput', false)
. \: j( j& R8 v7 @9 IshortNames = # \( m4 n, |, Z. r
    'Sun'    'Mon'    'Tue'    'Wed'    'Thu'    'Fri'    'Sat'! [' M% A, F0 s/ N( p$ Y
复制代码# S- p; y: m+ t) t2 q; r9 _
  deal:将输入参数赋值给输出 [Y1, Y2, Y3, ...] = deal(X{:}) ->可以简化[a,b,c,d] = C{:}
5 O' c7 R0 ]( C$ U3 }3 _; jcell数组的类型转换看到上面的那些类型转换函数,也许你会笑了,感觉也没有什么特别的,但是使用过这个cell数组的朋友,估计大部分都会有转换失败的经历-_-很坑爹的..., }( v* Q' H% h8 V2 o, {& J! f* X" \

3 t; C( t/ {) r$ v% Y  gCell Array and Struct Array( B1 s4 ?& w5 W! W2 C, Q
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不对
( j# M% ^+ u# w- \) {! ?   c = struct2cell(s)  struct数组转换为cell数组 这个基本没有什么错误的
  Y1 J& c8 P5 N; T
1 }+ E8 }0 v. ]: F( Y$ yMatrix and Cell Array7 `9 P- v3 m2 `) L; T
c = mat2cell(x, m, n) 转换为 m行n列cell数组 m = cell2mat(c) 必须是同一类型,而且限制不可包含cell数组或object类型,但是struct结构是可以的(同样这个struct不含 cell和object类型,否则依旧出错)  @1 a9 H1 Z$ J& C) M/ B

5 e% Q1 b4 b- u* R, h6 `Double and Cell Array
4 K$ p3 ~3 a9 C, WC = num2cell(A, [dim1, dim2, ...]) 返回C的维数是numel(A)/prod(X,Y,...)   dimN 是一个整数,范围是1到ndims(A)
, p! }, v% v1 [+ ~0 \只有数值矩阵才可以直接转换为cell,没有供cell转为double的方法.这是非常让人恼火的!不过理解之后就知道,cell本来就是混合类型的,直接转向数值类型单一矩阵,这样是不合理的.通常如果是的确是数值类型的可以走以下路线:cell->cell2mat 这时候注意cell2mat的条件非cell和object.否则,循环或者cellfun处理.如果可以使用 cell2mat 或者cat(dim,c{:}).很多时候都很方便
) Y4 }/ @. o$ u- JCell Arrays of Strings # f3 L. a/ b/ Q' ~) Y
单独列出了是因为很多时候都要接触这个,基本txt之类读取来的数值数据都是char的cell数组~
: {8 |( @" u) C% C1 l+ g) g, @可以使用cell参数与字符有关的部分函数(基本都支持)
% B0 c9 Q2 _9 w4 k6 \cellstr      Convert a character array to a cell array of strings.会去除末尾空白
6 V8 o/ p1 N% f, b$ {, v7 pchar        Convert a cell array of strings to a character array. 会恢复转换时候失去的空白$ k9 z, b5 U% w$ M
deblank   Remove trailing blanks from a string.$ v  M/ G6 M3 S  v! ~0 \
iscellstr    Return true for acell array of strings.
0 v3 U% }3 C) R; g/ G% zsort        排序.* G5 I& V! d+ m3 N2 h$ f8 Y
strcat连接字符.
# P. I, s. w+ a3 k- l; {% k4 V6 O& vstrcmp对比字符.) X# R/ E. p0 N* s5 z- p2 V
strmatch 查找字符.
7 r5 c5 C5 g* @& V& |$ istrrep 替换字符- {; B# ~" l1 Y8 G  c
regexp系列及accumarray支持行列向量.
& S" ?% P& K  h7 Q
* s% u) i7 V2 z读写
" y* f& J: J3 v% j2 W数据读取进来了,处理后当然是需要保存的,可是面对要求 你总是很无奈,要是可以.mat格式那个很好啊 可是大部分要求都是txt之类的.(不明白为什么呢 其实数据库之类Matlab也是支持的...唉,需求总是最后的注脚...)首先要了解怎么情况会有cell数组产生:具体查看textscan 的说明.大文件的读取首先推荐这个函数,处理灵活可以省去很多功夫,具体的格式设置很关键!能够有效分离cell数据的结果方便处理~否则3000万个数据循环绝对是out of memory...尽量使用高级的IO读写...另外,7.0很多读取都是数值返回cell的char类型数组 7.6以上都使用double了,包括xlsread...; ?- _/ }2 t. ^
如果允许,xlswrite是最好的选择~大量数据测试的结果还是非常好的  I4 f9 ?$ Y; f
在Matlab帮助里面的循环例子:
  @0 X: t! O4 C/ m' Mmycell = { 'a' 1 2 3 ; 'b' 4 5 6 };
6 l8 l+ I2 Y9 \1 d1 x5 g& @[nrows,ncols]= size(mycell);
  a( w. l) W2 N" y5 A% a0 }filename = 'celldata.dat';# r+ ?: N+ G- Q; D4 C/ P, x
fid = fopen(filename, 'w');
/ |* z' b5 I8 f( f1 U4 Ifor row=1:nrows
: m6 E9 l" Z" A1 [8 e' a8 r! `    fprintf(fid, '%s %d %d %d\n', mycell{row,:});% s, y& l" o- I5 A/ v
end
2 i. X* u; F9 N/ [fclose(fid);& Y1 Q& s/ P! h0 n( x3 n" }1 |$ w

' ]; l4 m$ S0 b8 |! T复制代码$ r! \, k1 Y" q; o  H$ G
仅有数值时候 可以考虑先cell2mat 然后csvwrite." {2 V# H: W1 x

4 Q* T1 q9 {% P0 G/ J/ a) W: Z& S/ S* l$ h5 R, q) B+ }4 q; `
总结9 Y: h8 c1 E6 A2 _* O& T
基本是就是总结了一下用法,特别是转换和保存方面的,相对于struct数组,由于Matlab中支持甚多,因此也就常用了.功能偏弱,但是基本按照规则,还是可以尽量减少出错的.4 f+ |" k8 U1 I& k4 c% s
希望大家也交换一下使用的心得~

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-22 02:22 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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