|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 faker12 于 2021-9-18 11:02 编辑
}% @/ l3 c% g$ g$ e/ F9 s/ x. m2 e, z3 R. k- E: V
第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。
4 ~: c) D) N+ v; t& C2 C
: `7 P# ~& b5 q2 O+ Hcell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体7 W4 z: Y% l2 j
# t+ X8 Q/ H, i y
1.cell数组的创建# J# g. @' ^. V- ]9 I2 Y/ w) {
) N8 h4 b h5 Q7 L7 ]: x/ ~* [+ f可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};
; a5 H1 G6 _( H( Z! G g0 I* C! T4 l3 x
也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};# I( ^7 {( {& F" H
A, }* t7 K# A# S/ u' I" i0 O2.cell数组的访问. m6 I7 s6 ?( @8 ^3 e
1 {7 p5 R# a$ ?1 W4 a g# v! x
与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。& X1 G; Q- y0 {6 a
5 G4 C' y, `, _- g: D w
2 y( I* v* v: U1 Z+ k
3.cell数组相关的函数
4 E- z ?+ }& R- J# o5 a4 w1 g. O' `/ [! K' S
cell:创建空的元胞数组,预分配内存% ?8 C1 b7 S1 z1 b
; f! N! W1 c4 D+ h2 t
celldisp:显示元胞数组所有内容6 q9 X4 l4 y# N( n
% D8 F" o/ f/ K# \. Z" w$ _1 ~) ^$ Z
cellplot:利用图形方式显示内容- i( Z; j1 `3 D" A6 E3 I
! b! n3 `* v' p3 @2 Q$ c0 T: b% `$ p
cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)
' O) c) l e8 v a0 f: g2 }; W& }: ^: Q" B7 {6 K0 I. T7 A
mat2cell:将普通矩阵转化成元胞数组4 F, x+ e+ x( N0 A3 h
; x. N7 k5 f! P) r" x
iscell:判断输入是否为元胞数组
5 u8 M! x( l* r3 F* ]" A& ]8 X( B2 L# k/ ~
cellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄2 U \: |4 ~$ I+ u; l4 {% C
# y4 X, t1 l# e0 @
A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)
' N) x* [% V9 d H1 \3 s. \9 V$ D: J4 w) d0 b c$ }" h; | D% D
默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。3 Z) }( Z+ Z# W; ?
, K- e5 ^0 @) A4 _% a8 N支持通过对象数组的线性索引进行赋值
0 B4 ?- p: @3 D% ]: _; `( o0 {1 W3 r- D& H
具有一个 reshape 方法,可返回与输入大小相同的数组
/ ^% ~3 E' V5 c- g; a7 I! {6 ^9 v- y
如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。
^5 H3 b3 A" s* X# i' X6 a) W6 u. }1 [3 I5 Y1 d% ^$ w
1 ?2 X' E" N* n+ Y- M, l
b={[1,2,1];[2,1,1];[1,1,2]};
: n m1 G- _" f* ~+ S: h7 Q& A6 Y& \9 T
c=cellfun(@(x)(mat2str(x)),b,'un',0)- c$ S1 K! l: t' W
( }4 b+ r/ [9 S; p
4 G3 S9 B+ y2 |8 P, V% i+ c; i
8 x. u3 k- z) N% ?0 |2 t
+ C( g" _& ^8 [8 j1 s
- w/ B/ L6 j5 o c+ T% B更一般的例子参见https://cn.mathworks.com/matlabcentral/answers/99632-how-do-i-save-a-cell-array-that-contains-both-strings-and-numbers-to-an-ascii-file-in-matlab$ e* w0 {' `: X, q6 V
0 w2 X9 s& \- X4 @4.cell单元的删除
! r7 z2 I# F- s/ q; S. ~& a( W0 `! J: t# u- w$ X
我们知道矩阵及矩阵的删除可以通过[]实现:$ @, d/ ^/ n/ z# v% E
% y& ?6 _2 w9 ^% o3 \" T
; V: x) P. X' Z O5 t+ A) c元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()/ w L, m: `! ^- @
3 m1 f6 j. F% A* x8 S$ aa={1,2,3};* A( W( _4 j1 U3 y. B
' R6 ~1 e+ k( d* s
a{1}=[];%并不能删除第一个cell单元,只是变成空值" p: X# L' a( \* }0 J. O' ~0 T7 \" r
0 g F3 O( Y7 s! f$ i8 h- h' |a(1)=[];%删除第一个单元
5 w) D, m y/ n# b, X% `( G/ [! A; o' G# i" F( B h2 K
# ]" H r. k+ r% j# K: ^, g
a()=[];%一次性删除所有cell单元- `, E5 u. y, E( [8 `( o+ N! [6 w
% T7 j2 i7 o# H3 F) E0 r7 a' z9 F3 @2 _* T6 ~
|
|