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

MATLAB中cell数组的是是非非

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

9 d- x  _( j! R由于工作需要,经常要处理大量的实验数据.基本都是由仪器导出来,随着社会发展的进步,人们获取数据的量在不断增长,很多人都是,现在已经是海量数据时代了...  o2 R& H6 z* P  R
从cell使用说起
, T3 _" a3 u: g4 o; t在读取文件的时候,cell数组(各种翻译都有,元胞数组,单元数组...直接无视)是MATLAB的宠儿,基本都会出现,长期使用发现频率比struct高了不少~无论是Import Data还是使用textscan之类来获取数据.从长期使用高级语言的角度来说,特别是习惯了面向对象之后i,更习惯使用struct数组,概念也很相似,奈何现实是...我们先看一下Matlab在help给出的定义:
9 f/ E! x+ w5 f' S6 QA cell array is a collection of containers called cells in which you can store different types of data.
; Y: R' \1 R$ H) a2 U; T0 N& \8 k) @. ^
精华之处就是在可以存储不同类型的数据.可以是Matlab的类型或者自定义的类型.7 `1 m4 N  P) }! `8 |
cell数组的一些操作
6 Z$ g( r% f1 }* ~" q, R# V+ ]  p5 I创建:直接使用{}以及cell(...)形式,另外 下标法赋值也可以.注意后两种可以预配内存,内存是空间连续的~
0 P4 ]: Q# m$ P' I" B6 b读取内容:{下标}和(下标)  区别在于类型()是cell数组 ,{}是实际类型.结果显示是一致的" Y$ i. ?$ D2 f  ^
>> a={'啊',123,[3 5 6],[1 2;7 8],sym(1)}6 f0 |7 A2 x  |; a0 g5 v6 {6 y
a = $ i6 f: b) R! R6 k" e% i! r
    '啊'    [123]    [1x3 double]    [2x2 double]    [1x1 sym]
8 k' F3 P! g% `* ^3 o8 f/ x1 y* w>> class(a{1})9 ^* R  d4 H7 ?: h# ^. |
ans =
7 O) q1 c; K2 @. @  Qchar
$ |9 h! b( m/ y5 v. m>> class(a(1))
5 v3 d6 E; `5 F% hans =
3 B2 A: K# ]" kcell% B# o4 N7 H- O. X
>>
+ f5 g" h- N% u* Q) i4 t" M! vC{5,3}{4,7}(:,4)
+ }5 A6 h( K# }解读: cell数组的一个元素为cell类型,包含一个普通矩阵类型* J* Q3 }0 Q" w. ]! Z+ L& ^
x = C{5,3};      % x is a cell array
! T6 D0 h; V0 Z8 sy = x{4,7};      % y is also a cell array
: y6 u( u& _( D' n2 ~# s, i5 tz = y(:,4)       % z is a standard array
2 T8 y  w/ R- B" r4 R! `% r& @复制代码2 [, l& d' L& K$ S: b7 @$ Z
调整内容:添加和删除与普通矩阵方法一致
7 Q0 t6 @) I) A1 T; S4 `' @相关函数:: j8 ^7 f/ s' ^" i* ~" y
  celldisp:显示所有的内容. L9 s3 P) B1 f) ?6 z
cell:创建空的元胞数组
' \3 W8 |4 ~. F) H# E( j  cellplot:利用图形方式显示内容% F; x9 _6 r! s! v3 [# _7 G  g
  cell2mat:将数组转变成为普通的矩阵* ?. G$ l# |' C  V! C
  mat2cell:将数值矩阵转变成为cell数组8 Z7 |8 G8 c* }& J: s2 m
  num2cell:将数值数组转变成为cell数组
4 t0 a0 J; r2 o5 a' K  cell2struct:将数组转变成为结构
$ g( J' f7 {* B2 _% _( e& }7 ?  struct2cell:将结构转变为cell数组" `$ O7 H- p) Q
  iscell:判断输入是否为cell数组
4 `0 A2 Y; K; z4 d! a6 Rcellfun:为cell数组的每个cell执行指定的函数 fun可以是特殊函数或者句柄
. r* w- `/ W# j) |* Z: Udays{1} = 'Sunday';    days{2} = 'Monday';
/ g% D6 H7 r) w: x; {days{3} = 'TuESDay';   days{4} = 'Wednesday';0 I8 \9 w2 B4 n# T0 m, A: k  v
days{5} = 'Thursday';  days{6} = 'Friday';: `: l; ]1 i+ C
days{7} = 'Saturday';7 p' P; ^3 |" t, o. g5 s3 t0 j6 W

5 ~5 C* Z0 X( y: s) AshortNames = cellfun(@(x)x(1:3), days, 'UniformOutput', false): q& [' ~! a& t# _) H2 X
shortNames = + [, A. `8 D% H+ H/ b" f
    'Sun'    'Mon'    'Tue'    'Wed'    'Thu'    'Fri'    'Sat'
5 [* d9 N2 }- V复制代码: }1 P% E# [* i' w5 J0 z
  deal:将输入参数赋值给输出 [Y1, Y2, Y3, ...] = deal(X{:}) ->可以简化[a,b,c,d] = C{:}( \9 F* F3 {* v2 Q2 S- S' ^! I
cell数组的类型转换看到上面的那些类型转换函数,也许你会笑了,感觉也没有什么特别的,但是使用过这个cell数组的朋友,估计大部分都会有转换失败的经历-_-很坑爹的...! T9 H6 J  {' [" ~

/ K# O" \% Y" T1 P$ ]# M0 t, ^Cell Array and Struct Array
9 [6 U! j& O4 w8 s8 Rs = 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不对4 I$ c1 M5 s( X4 s  S( G
   c = struct2cell(s)  struct数组转换为cell数组 这个基本没有什么错误的9 m4 F8 a8 l. d/ Z, D- I

3 ^; i, T. |7 w4 P. y0 QMatrix and Cell Array
! d+ S& w) Y9 y. m$ h6 W1 M+ ~4 [- hc = mat2cell(x, m, n) 转换为 m行n列cell数组 m = cell2mat(c) 必须是同一类型,而且限制不可包含cell数组或object类型,但是struct结构是可以的(同样这个struct不含 cell和object类型,否则依旧出错)6 A$ ^$ R9 U4 u3 w, P

; I2 q) ^% b. N; ]- l+ aDouble and Cell Array9 z7 B+ x: l1 y0 i! d! o6 G% u
C = num2cell(A, [dim1, dim2, ...]) 返回C的维数是numel(A)/prod(X,Y,...)   dimN 是一个整数,范围是1到ndims(A)$ ?' a: m9 ^, @. A6 y
只有数值矩阵才可以直接转换为cell,没有供cell转为double的方法.这是非常让人恼火的!不过理解之后就知道,cell本来就是混合类型的,直接转向数值类型单一矩阵,这样是不合理的.通常如果是的确是数值类型的可以走以下路线:cell->cell2mat 这时候注意cell2mat的条件非cell和object.否则,循环或者cellfun处理.如果可以使用 cell2mat 或者cat(dim,c{:}).很多时候都很方便$ v# `6 B' [7 B, t" g' k' \
Cell Arrays of Strings
; X: L: g& F/ A2 t单独列出了是因为很多时候都要接触这个,基本txt之类读取来的数值数据都是char的cell数组~
" Y4 H0 y* o, w2 A4 [$ e& e可以使用cell参数与字符有关的部分函数(基本都支持)
& F) g1 E9 `( D- ~& \2 h: Bcellstr      Convert a character array to a cell array of strings.会去除末尾空白; v) M- Q  I$ u7 \
char        Convert a cell array of strings to a character array. 会恢复转换时候失去的空白# l# n1 Q/ p6 F4 x' C
deblank   Remove trailing blanks from a string., U% i* T! _8 t. m  U
iscellstr    Return true for acell array of strings." k/ Y' x, A. j! g  a7 H2 K4 T
sort        排序.
. q; a6 s. Q8 a2 @+ |strcat连接字符.$ c6 @  k+ g  G$ l& w" W. l
strcmp对比字符.8 ^  T+ m. \, f- }
strmatch 查找字符.
% L. P& ~: ^5 a1 z, K2 I  z4 hstrrep 替换字符  S7 |  A% A# |/ X# J! ~, a
regexp系列及accumarray支持行列向量.
9 Y1 V9 H- t9 }" J0 ]7 I0 _
! H1 p; P6 L- E& i读写
3 K1 t2 r+ K2 k数据读取进来了,处理后当然是需要保存的,可是面对要求 你总是很无奈,要是可以.mat格式那个很好啊 可是大部分要求都是txt之类的.(不明白为什么呢 其实数据库之类Matlab也是支持的...唉,需求总是最后的注脚...)首先要了解怎么情况会有cell数组产生:具体查看textscan 的说明.大文件的读取首先推荐这个函数,处理灵活可以省去很多功夫,具体的格式设置很关键!能够有效分离cell数据的结果方便处理~否则3000万个数据循环绝对是out of memory...尽量使用高级的IO读写...另外,7.0很多读取都是数值返回cell的char类型数组 7.6以上都使用double了,包括xlsread...
& S/ ~! m" U' n; J如果允许,xlswrite是最好的选择~大量数据测试的结果还是非常好的
3 `1 {6 F$ W6 s8 ]在Matlab帮助里面的循环例子:' E  y; j7 E$ z6 s: x
mycell = { 'a' 1 2 3 ; 'b' 4 5 6 };6 @: O3 L/ o0 j  Y7 V7 e
[nrows,ncols]= size(mycell);. W7 v5 {" E# Q; o" Y9 n( r8 N9 d* P
filename = 'celldata.dat';
2 r- M3 u8 v. M. T: u# X" K8 B9 Vfid = fopen(filename, 'w');
: r6 D9 `& z2 k' Lfor row=1:nrows
0 u1 m& o6 i7 a( b4 U6 a    fprintf(fid, '%s %d %d %d\n', mycell{row,:});
: k; K" [6 `) g4 _+ Iend
5 |8 S. F2 O3 w& P6 O8 Ufclose(fid);9 Q/ D2 P: u' w4 g/ m8 J1 v$ O
' o9 A3 n& ^: s
复制代码
: V2 C* n9 ?8 k8 q6 I仅有数值时候 可以考虑先cell2mat 然后csvwrite.
5 H. M# i% J% g6 @
) u" `% q) Z% k# ?# f6 F3 R% b" O: B5 ?7 P& T4 [4 \, W# M
总结/ @: D, M( e: E2 v
基本是就是总结了一下用法,特别是转换和保存方面的,相对于struct数组,由于Matlab中支持甚多,因此也就常用了.功能偏弱,但是基本按照规则,还是可以尽量减少出错的.
8 _+ w7 U" e' Y& K希望大家也交换一下使用的心得~

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-12 17:01 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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