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

MATLAB中cell数组的是是非非

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

" g) S* b9 D) ]* P; {& d) H* P由于工作需要,经常要处理大量的实验数据.基本都是由仪器导出来,随着社会发展的进步,人们获取数据的量在不断增长,很多人都是,现在已经是海量数据时代了...
$ p, q. w7 r% r1 h" e, e7 r  V从cell使用说起
- j# y9 m9 p: H* S在读取文件的时候,cell数组(各种翻译都有,元胞数组,单元数组...直接无视)是MATLAB的宠儿,基本都会出现,长期使用发现频率比struct高了不少~无论是Import Data还是使用textscan之类来获取数据.从长期使用高级语言的角度来说,特别是习惯了面向对象之后i,更习惯使用struct数组,概念也很相似,奈何现实是...我们先看一下Matlab在help给出的定义:
6 W' c( Q8 \* c' E* Z4 u" x0 [A cell array is a collection of containers called cells in which you can store different types of data.
5 i7 E* ^: K+ e9 j/ ?8 p( M7 m0 y: N1 P( |; e. U( R9 j
精华之处就是在可以存储不同类型的数据.可以是Matlab的类型或者自定义的类型.* Z: g- C2 E1 x8 ^
cell数组的一些操作% r) B( v  G2 W( G, L* o" o  C
创建:直接使用{}以及cell(...)形式,另外 下标法赋值也可以.注意后两种可以预配内存,内存是空间连续的~
, n% p" K  q% J8 S# g9 r6 [读取内容:{下标}和(下标)  区别在于类型()是cell数组 ,{}是实际类型.结果显示是一致的
5 }; R$ a; O) o# P>> a={'啊',123,[3 5 6],[1 2;7 8],sym(1)}% t! O: ^2 L' d6 ^3 n0 L
a = 1 R  I4 k& Z9 v" w) d. P
    '啊'    [123]    [1x3 double]    [2x2 double]    [1x1 sym]9 s3 n' a3 k& _0 F
>> class(a{1})
* V. S+ ~* o, ]2 R; R; cans =
5 x3 T7 B  A& k0 K) C% ^6 m; S( o2 ^char
* J0 p& {& h6 c* s% H>> class(a(1))
( g+ _- T; l7 Z. M; I  ^ans =
  m$ T" {1 F5 K9 A# `& o" s, wcell9 P: I3 D: O- K
>> + C) ?* F( q- h9 m1 G
C{5,3}{4,7}(:,4)" o2 i# g  c/ |) x( d6 ]
解读: cell数组的一个元素为cell类型,包含一个普通矩阵类型
1 N1 T' A- G, D) }% x& _x = C{5,3};      % x is a cell array0 q+ j% A9 M5 z  v9 s( U
y = x{4,7};      % y is also a cell array  ]; F3 T6 z3 K) b- c* J) u
z = y(:,4)       % z is a standard array) `8 X% c$ J0 P* c
复制代码
0 N) z/ J1 r* M' A# @调整内容:添加和删除与普通矩阵方法一致8 r9 d- c' B% h
相关函数:
; |6 f& v7 U) O/ M  celldisp:显示所有的内容  ^7 e" J6 n8 i; |
cell:创建空的元胞数组5 V1 ]2 Z, D+ j% D/ s
  cellplot:利用图形方式显示内容# I# D* O/ j  ?3 c. E
  cell2mat:将数组转变成为普通的矩阵% n6 B8 T% I% S( u, T( O( l+ F+ X
  mat2cell:将数值矩阵转变成为cell数组
9 }% y: m/ }' d9 L  num2cell:将数值数组转变成为cell数组
! ?9 }) w5 ^5 u$ V1 t2 q  cell2struct:将数组转变成为结构
- R+ j1 ^1 c, Y1 A( v  struct2cell:将结构转变为cell数组$ b9 R4 L% _# x0 N# B# z
  iscell:判断输入是否为cell数组# |9 O+ b8 C& D. p3 o: K
cellfun:为cell数组的每个cell执行指定的函数 fun可以是特殊函数或者句柄6 i7 d2 E$ e  s% Z
days{1} = 'Sunday';    days{2} = 'Monday';
" ^( p! _% P; u8 _days{3} = 'TuESDay';   days{4} = 'Wednesday';% t8 C- {6 n6 S  K% X
days{5} = 'Thursday';  days{6} = 'Friday';. h  n2 z: w1 ?! H: \
days{7} = 'Saturday';6 q5 O. t* v. }. V/ X+ U8 H

% ?- w0 l: o% s2 KshortNames = cellfun(@(x)x(1:3), days, 'UniformOutput', false)
7 p/ t: u+ g) A4 A+ l7 Y# WshortNames = . k3 I; a6 D7 F4 C8 v% h
    'Sun'    'Mon'    'Tue'    'Wed'    'Thu'    'Fri'    'Sat'& f4 Q& ?) Y9 H5 \
复制代码
' N) S* Y& T! @; r6 O  deal:将输入参数赋值给输出 [Y1, Y2, Y3, ...] = deal(X{:}) ->可以简化[a,b,c,d] = C{:}
- k, T; S  r$ y& `cell数组的类型转换看到上面的那些类型转换函数,也许你会笑了,感觉也没有什么特别的,但是使用过这个cell数组的朋友,估计大部分都会有转换失败的经历-_-很坑爹的...
7 L( h- V6 }0 i8 A9 L0 M5 G& L
; D0 d) {! w3 F* V/ G3 h5 jCell Array and Struct Array
6 }8 k/ w- v0 m! b$ k7 Hs = 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不对) Y$ O* j$ r" A* N0 a
   c = struct2cell(s)  struct数组转换为cell数组 这个基本没有什么错误的
( C  X4 J1 c" J1 l* v2 t  @0 b5 j4 A4 Y0 ]3 X( X$ V" V
Matrix and Cell Array4 ^9 T% W5 {- l3 q
c = mat2cell(x, m, n) 转换为 m行n列cell数组 m = cell2mat(c) 必须是同一类型,而且限制不可包含cell数组或object类型,但是struct结构是可以的(同样这个struct不含 cell和object类型,否则依旧出错)
9 S/ h9 I; ~2 E) T: ?+ g4 `
4 D2 d- H2 J: P, h$ ~/ dDouble and Cell Array( s: K1 H9 V! b
C = num2cell(A, [dim1, dim2, ...]) 返回C的维数是numel(A)/prod(X,Y,...)   dimN 是一个整数,范围是1到ndims(A)& r! d# p$ P* J5 X! D  [
只有数值矩阵才可以直接转换为cell,没有供cell转为double的方法.这是非常让人恼火的!不过理解之后就知道,cell本来就是混合类型的,直接转向数值类型单一矩阵,这样是不合理的.通常如果是的确是数值类型的可以走以下路线:cell->cell2mat 这时候注意cell2mat的条件非cell和object.否则,循环或者cellfun处理.如果可以使用 cell2mat 或者cat(dim,c{:}).很多时候都很方便; S! B5 |/ z" c7 b7 e
Cell Arrays of Strings
: V+ t+ }* W- S/ C( D. F& B单独列出了是因为很多时候都要接触这个,基本txt之类读取来的数值数据都是char的cell数组~
8 p. y. S- J. Q2 s可以使用cell参数与字符有关的部分函数(基本都支持)" q: \% S5 @4 L* r0 E" R" \
cellstr      Convert a character array to a cell array of strings.会去除末尾空白# t5 t3 ?) j. T5 u0 A
char        Convert a cell array of strings to a character array. 会恢复转换时候失去的空白
& j' @4 N- R$ g: U3 ydeblank   Remove trailing blanks from a string.9 Z. t* ]* L- n+ `! U8 H
iscellstr    Return true for acell array of strings.
: Y' C% q, ]5 _sort        排序.% Q6 Q; m% o' R% L% w, L
strcat连接字符.$ P6 w: d) h+ S, T/ w- w
strcmp对比字符.
8 @9 a# M- M2 X6 J3 l0 s0 Ostrmatch 查找字符.
0 ~1 k; V$ G6 \' A0 ^strrep 替换字符# \: r0 {, L+ p4 E& r9 P
regexp系列及accumarray支持行列向量.
; e" A+ U* ?2 b5 e6 [/ S% g3 t* y4 K  [6 n4 f6 {* G
读写! @& Q; n1 D: k
数据读取进来了,处理后当然是需要保存的,可是面对要求 你总是很无奈,要是可以.mat格式那个很好啊 可是大部分要求都是txt之类的.(不明白为什么呢 其实数据库之类Matlab也是支持的...唉,需求总是最后的注脚...)首先要了解怎么情况会有cell数组产生:具体查看textscan 的说明.大文件的读取首先推荐这个函数,处理灵活可以省去很多功夫,具体的格式设置很关键!能够有效分离cell数据的结果方便处理~否则3000万个数据循环绝对是out of memory...尽量使用高级的IO读写...另外,7.0很多读取都是数值返回cell的char类型数组 7.6以上都使用double了,包括xlsread...
2 z8 |) o/ B6 M1 x. }) w如果允许,xlswrite是最好的选择~大量数据测试的结果还是非常好的
7 i4 w. [. i% ?) Q7 m6 _  u在Matlab帮助里面的循环例子:! C1 j8 e$ N5 a
mycell = { 'a' 1 2 3 ; 'b' 4 5 6 };$ [* J) z8 H" i; L  ]: e
[nrows,ncols]= size(mycell);
: p: r7 T& D9 s( U8 Ofilename = 'celldata.dat';% t$ M) R  G8 _; m1 B
fid = fopen(filename, 'w');  }+ C  n+ V- u" M* E
for row=1:nrows
7 d% {9 x3 k8 C- J$ e  A1 z$ b( \; ~    fprintf(fid, '%s %d %d %d\n', mycell{row,:});
5 o. I) X+ `; O3 R# B5 b. D" j, mend
& d  s" a* n' \0 Q! j5 zfclose(fid);! x0 T2 o* j# h* C2 _
, f- |. l7 W" Q% k/ w
复制代码3 o3 w$ x& C8 D' J
仅有数值时候 可以考虑先cell2mat 然后csvwrite.5 h( b5 a7 x! ~: n
; i1 W6 m6 J# ]

' I! F0 Y) G! C7 G3 i3 z总结
2 Z5 w: B% n; u! P基本是就是总结了一下用法,特别是转换和保存方面的,相对于struct数组,由于Matlab中支持甚多,因此也就常用了.功能偏弱,但是基本按照规则,还是可以尽量减少出错的.' U$ U+ B$ q5 w4 k; o. _
希望大家也交换一下使用的心得~

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 13:40 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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