|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 faker12 于 2021-9-18 11:02 编辑
) m( O2 v% l0 d* b, b: M/ r6 t# y/ V* _; l
第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。
/ l+ k5 w8 B6 x6 y, M; x4 c- f% w, [" O& F& W
cell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体
8 V% i* [( U( D2 [, Q- b" M9 o& I3 P) N
1.cell数组的创建' ]1 \9 n, S- c t
( ~* H/ l, M! a- z% a C( q可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};
' r6 g" @& n. |! k9 ~; A3 H
, V& F2 n5 D) M$ v& P6 Y也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'}; R5 x2 ^( j: o8 z6 @& @: q: \
8 g% y0 Z: v# E! [7 u. G) u2.cell数组的访问1 f3 g0 G! `" m. p0 Z5 E3 N. \
" w- I8 C" I0 j& g0 _与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。
" N5 i; m, U+ R* Y* s4 ]8 K; _7 n0 N; z: r, d" Z& Q
3 M0 d& Y, u- C, w8 W3.cell数组相关的函数
2 I+ V3 c2 P; R# V: T! q1 W7 ?+ x) s3 p6 ^3 I' j* i; d( t
cell:创建空的元胞数组,预分配内存0 @& _! g/ ]6 I) @6 T7 z8 b
8 j, Z. g( c, s5 L1 u/ {5 e2 f& F. Q' w3 Q
celldisp:显示元胞数组所有内容
* k* G; v& l- z, a9 |) P/ u" W: f+ I
cellplot:利用图形方式显示内容- R7 q/ g: e* k# Q4 D8 i
( V: c# f1 g# e" u1 y5 D$ ]% C: Y' r
* ~. q6 i m% ^4 L) ?) E$ u' A- K0 r
cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵); o' Q5 j9 A( b, E# P A
4 l! X# n1 e# P$ h! d
mat2cell:将普通矩阵转化成元胞数组$ Y r, B% A) b5 ?" m
) K' e6 S, | T: W/ ?iscell:判断输入是否为元胞数组
8 A+ p- L9 P$ b6 d8 [# K$ q
7 M& U5 Q- g: ?cellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄4 H& [, S, A% i* Y8 ]
! G$ `4 g" S% o$ j, _3 x+ xA = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)' S7 |/ H# C, |6 B# C
$ `" k" d2 w* M0 k# U% V8 ~默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。0 T4 ]* R0 A2 N
- [- F N9 Z( ^4 s3 B
支持通过对象数组的线性索引进行赋值5 W. l" \" f: Z1 X; k
- J* Q8 i" @$ k8 g" \: I9 j
具有一个 reshape 方法,可返回与输入大小相同的数组' z" P/ ?1 I& W# ~) @/ {; `
" `/ {# Q+ P, q( S' \% |
如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。
7 V0 k; L2 o% E1 {" B6 s" _8 ^, a: }1 B! y
. d9 V1 i6 x: g" }1 i7 \2 S5 bb={[1,2,1];[2,1,1];[1,1,2]};* U' B7 B6 g0 w q* H% a8 ~
: b/ U7 Z1 n4 Q/ D4 c) m- J, o, K
c=cellfun(@(x)(mat2str(x)),b,'un',0)
( e9 ?0 b" g; @- c$ N. x 1 M9 f6 V: h: P& {- `; N0 ~" o
b! c+ ]! `. T; B0 k4 ]* O- e
" a0 d: j- C) Y4 [5 w 5 r, J; } O7 d9 t+ N1 |& {7 e. ~4 f
5 j2 k) E. i- X* U
更一般的例子参见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, X* e- J u5 F* o
- y3 i" d0 b- _* v( X/ D2 @
4.cell单元的删除
. O# L" A3 \1 R* O$ `8 d" ^" i1 S' W6 t$ P" [
我们知道矩阵及矩阵的删除可以通过[]实现:
1 Q, I* ~# w5 x, e) L! o4 f* Q7 @' Y, x& \, B$ b* H {& q! a! S
, H( m- H6 F6 L0 t元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()
: H8 F0 J# t+ O$ w9 W H5 u" c1 o6 W: \# o
a={1,2,3};
; Q8 b' x7 Z/ E9 c" |; L9 A5 M; t# c) b/ {) l: b
a{1}=[];%并不能删除第一个cell单元,只是变成空值/ ?0 a2 a; C' e8 o8 ^4 w+ K
6 K) u0 J8 X: A& r" W9 M0 d3 H, g' q# ga(1)=[];%删除第一个单元
( B8 r+ I0 k: ]4 S, W* p7 w3 [. b5 s! c
, f2 `* W* U! F- j, Q+ A, Oa()=[];%一次性删除所有cell单元
/ r. ~- E& s! Y9 l% B( h \* W
! R; H2 _* W8 o$ Z; ?
9 u1 N: `+ z: U; W0 ]) K4 [5 n |
|