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

MATLAB中cell数组的是是非非

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
3 M2 Z" J, R, L( H9 P, j# F/ G
由于工作需要,经常要处理大量的实验数据.基本都是由仪器导出来,随着社会发展的进步,人们获取数据的量在不断增长,很多人都是,现在已经是海量数据时代了...2 s$ ^% ]/ F" d+ R7 R- d- W( p
从cell使用说起
" g) k0 l9 p* s* n在读取文件的时候,cell数组(各种翻译都有,元胞数组,单元数组...直接无视)是MATLAB的宠儿,基本都会出现,长期使用发现频率比struct高了不少~无论是Import Data还是使用textscan之类来获取数据.从长期使用高级语言的角度来说,特别是习惯了面向对象之后i,更习惯使用struct数组,概念也很相似,奈何现实是...我们先看一下Matlab在help给出的定义:
+ p. M2 R, J! G; P* L; O+ oA cell array is a collection of containers called cells in which you can store different types of data.
. g' C* w9 z0 V& l
3 g% `: _8 G7 \9 }# J精华之处就是在可以存储不同类型的数据.可以是Matlab的类型或者自定义的类型.
# D/ q$ _0 u# v! ucell数组的一些操作
" V& q% y) i3 Q6 N" E% u( ~; m创建:直接使用{}以及cell(...)形式,另外 下标法赋值也可以.注意后两种可以预配内存,内存是空间连续的~
4 x! F6 l# m8 H) n: s7 i读取内容:{下标}和(下标)  区别在于类型()是cell数组 ,{}是实际类型.结果显示是一致的% k1 f, a7 `4 S6 X
>> a={'啊',123,[3 5 6],[1 2;7 8],sym(1)}- C1 ^. M; v. @' j) M0 c
a =
% H/ I. L/ Y% @# v- N    '啊'    [123]    [1x3 double]    [2x2 double]    [1x1 sym]" i' J# E5 X' m/ c! q' O0 {' m
>> class(a{1}). O* ~- C. G& `! `! h
ans =. K( I! u9 p  `' T
char
$ f) c4 {. E& E7 u% l* p6 d/ E>> class(a(1))
& N7 q' {- d2 e/ ^$ g% d& p9 Yans =
5 H9 e9 h# e$ X/ @9 X9 |0 Z' E* ocell6 B* m! P7 D4 z1 k
>> 4 ?0 F7 d6 B, V, n! i! z
C{5,3}{4,7}(:,4)
8 l+ a1 K3 R% {+ O7 @( [解读: cell数组的一个元素为cell类型,包含一个普通矩阵类型
% o+ H+ A3 g: H2 x* Tx = C{5,3};      % x is a cell array
- R8 o! s! z: }1 a5 G1 ay = x{4,7};      % y is also a cell array
  b# a9 n2 Y& r) b$ j$ O* v$ G  Kz = y(:,4)       % z is a standard array
% y/ l* a" g+ q! ?复制代码
6 M; f! i- s' L0 c调整内容:添加和删除与普通矩阵方法一致, e/ F% f  _, c1 b9 I" f% {# _- |5 e) {
相关函数:5 S3 U; n" ?8 _/ y1 L% s
  celldisp:显示所有的内容& C/ A* p: F0 K- h3 m0 m
cell:创建空的元胞数组
& m" [6 B- }2 h  cellplot:利用图形方式显示内容, T' `( C8 ~; Q0 d7 E6 T6 _: Y
  cell2mat:将数组转变成为普通的矩阵$ J* g" }5 A' h7 D; W
  mat2cell:将数值矩阵转变成为cell数组8 ^- o. r8 I7 R  [# V/ \5 p
  num2cell:将数值数组转变成为cell数组0 [0 Q9 S% n0 U: u, a4 g  c) u
  cell2struct:将数组转变成为结构! E% t6 b; z/ u, K6 q9 n
  struct2cell:将结构转变为cell数组5 o' l; ~6 z$ q5 [: g3 h
  iscell:判断输入是否为cell数组8 t3 u  S# t; }: z! p( T8 H. k
cellfun:为cell数组的每个cell执行指定的函数 fun可以是特殊函数或者句柄
" h4 K( s4 U2 G- O- {days{1} = 'Sunday';    days{2} = 'Monday';. w: J- T$ C) c6 \
days{3} = 'TuESDay';   days{4} = 'Wednesday';
( I5 f& m; o% b0 v0 U% Q* Xdays{5} = 'Thursday';  days{6} = 'Friday';6 u8 C+ M$ {3 Z6 T: N+ x, d
days{7} = 'Saturday';3 v+ S5 D$ y2 o; i2 X% z" A, z* s
* R2 ^) W, p% K+ a3 j( W; L! Y7 @1 N$ ?
shortNames = cellfun(@(x)x(1:3), days, 'UniformOutput', false)
) t* ]' s+ Y! y; i' vshortNames =
9 {5 F  ^" n. {! H    'Sun'    'Mon'    'Tue'    'Wed'    'Thu'    'Fri'    'Sat'- `: h) B: z5 y! D' J% v5 Z
复制代码& B( K. P  \! |
  deal:将输入参数赋值给输出 [Y1, Y2, Y3, ...] = deal(X{:}) ->可以简化[a,b,c,d] = C{:}
9 D2 D: ?4 v1 P& Vcell数组的类型转换看到上面的那些类型转换函数,也许你会笑了,感觉也没有什么特别的,但是使用过这个cell数组的朋友,估计大部分都会有转换失败的经历-_-很坑爹的...
( X! v; H5 m- c" I" g& u% u7 p+ U# |( c$ ^( ~! P2 y, M5 {
Cell Array and Struct Array7 g- l) W' N6 p1 ~5 @* T
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不对
+ ?/ C% z, D8 ~   c = struct2cell(s)  struct数组转换为cell数组 这个基本没有什么错误的+ o2 ^6 ?4 V6 R7 G% Z2 A
& c3 R, y* m* K6 m6 w
Matrix and Cell Array: r( M" y0 m' A  w6 ?
c = mat2cell(x, m, n) 转换为 m行n列cell数组 m = cell2mat(c) 必须是同一类型,而且限制不可包含cell数组或object类型,但是struct结构是可以的(同样这个struct不含 cell和object类型,否则依旧出错)" O7 v, t2 k% d: y* J
7 m6 Y3 k% G$ b
Double and Cell Array
+ X' U8 _4 ^/ U. p; JC = num2cell(A, [dim1, dim2, ...]) 返回C的维数是numel(A)/prod(X,Y,...)   dimN 是一个整数,范围是1到ndims(A)( _* j& t3 k- f/ W+ R
只有数值矩阵才可以直接转换为cell,没有供cell转为double的方法.这是非常让人恼火的!不过理解之后就知道,cell本来就是混合类型的,直接转向数值类型单一矩阵,这样是不合理的.通常如果是的确是数值类型的可以走以下路线:cell->cell2mat 这时候注意cell2mat的条件非cell和object.否则,循环或者cellfun处理.如果可以使用 cell2mat 或者cat(dim,c{:}).很多时候都很方便
: M  ]2 O4 y5 `6 Z" D$ {Cell Arrays of Strings 2 v4 M# a7 g' i# ]( L
单独列出了是因为很多时候都要接触这个,基本txt之类读取来的数值数据都是char的cell数组~" e  f! r3 l% u4 t, }6 b6 ^1 M
可以使用cell参数与字符有关的部分函数(基本都支持)5 R2 y% y- o. \& P3 H& K9 m  W
cellstr      Convert a character array to a cell array of strings.会去除末尾空白: ?4 ^# a1 z* M
char        Convert a cell array of strings to a character array. 会恢复转换时候失去的空白/ I5 {5 y4 R$ L5 i, ]5 H$ ~
deblank   Remove trailing blanks from a string.: S- [- u0 l- A# ]  q! e5 a
iscellstr    Return true for acell array of strings.
7 ]& ?9 E# I' V1 C, `sort        排序.
0 h: Q3 w. r7 S" U6 ?5 e+ d" Hstrcat连接字符.
. I7 ~/ S9 Y& K% C9 [, fstrcmp对比字符.
: \% z2 c$ ?! E0 g  Cstrmatch 查找字符.
+ R5 S3 ?8 L! x& [2 \2 v) Gstrrep 替换字符0 d2 e9 m  M1 d! g; V# F8 ]
regexp系列及accumarray支持行列向量.3 ?, l: {9 k  l! O+ s. @
5 Q. e6 ~+ e% f3 _- t
读写+ K% ?: F9 x7 |& d' l4 Q
数据读取进来了,处理后当然是需要保存的,可是面对要求 你总是很无奈,要是可以.mat格式那个很好啊 可是大部分要求都是txt之类的.(不明白为什么呢 其实数据库之类Matlab也是支持的...唉,需求总是最后的注脚...)首先要了解怎么情况会有cell数组产生:具体查看textscan 的说明.大文件的读取首先推荐这个函数,处理灵活可以省去很多功夫,具体的格式设置很关键!能够有效分离cell数据的结果方便处理~否则3000万个数据循环绝对是out of memory...尽量使用高级的IO读写...另外,7.0很多读取都是数值返回cell的char类型数组 7.6以上都使用double了,包括xlsread...
9 s! l/ A8 O* y4 {% R如果允许,xlswrite是最好的选择~大量数据测试的结果还是非常好的9 }- w0 E0 R, M7 R6 u1 \6 K
在Matlab帮助里面的循环例子:+ _3 t( Y0 C/ ^9 m6 e  s# J
mycell = { 'a' 1 2 3 ; 'b' 4 5 6 };
  O) H( Z% m# }& f' M( W3 y2 U[nrows,ncols]= size(mycell);) b+ t5 [. B2 D
filename = 'celldata.dat';
1 p' y* e! b* M- f2 N; K' m) W4 Afid = fopen(filename, 'w');1 L: v  B3 ~2 ^. k4 u
for row=1:nrows
* G, p8 J& D! W    fprintf(fid, '%s %d %d %d\n', mycell{row,:});
: U! H4 E" s" q- P. P  M& H) m. Mend0 D5 v0 b$ W" E9 ]7 I! W
fclose(fid);5 p9 B3 @2 z" S1 y, r
  D. }" ^" p; O& H
复制代码/ _% P; c: N3 D! z
仅有数值时候 可以考虑先cell2mat 然后csvwrite.
8 `" l0 o+ N% |+ N* V
0 E0 @7 M, {( E3 \3 U+ |4 y" u! _. A- `4 h
总结; n7 R% C& r( j( R* X. L& @' t
基本是就是总结了一下用法,特别是转换和保存方面的,相对于struct数组,由于Matlab中支持甚多,因此也就常用了.功能偏弱,但是基本按照规则,还是可以尽量减少出错的.
) d; E& T1 g; o' g希望大家也交换一下使用的心得~

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-12 12:05 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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