|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 faker12 于 2021-9-18 11:02 编辑
X& ~7 Z# k7 f0 T8 x# a& N) L' V1 a- w6 g, z
第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。
3 h9 J3 O" {+ V# {# E9 l: }4 R/ h$ i, q; v1 ?
cell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体% I6 Z2 [ h7 H' \8 d7 j
J5 p+ y! v/ N5 k% D. P% y
1.cell数组的创建* C+ B' w) I6 p H4 @
8 p0 b' W/ L" X$ Q4 ]+ \1 a- ?7 G
可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};7 r" G% @- P6 W% v% ?
' z& g: H( ?* W" ~$ [
也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};
5 i+ ^% ]7 g0 x! N
3 [5 s, K- l, W2 B' v* y4 k) Q2.cell数组的访问
, L. G4 L" k* g# V
5 M: Q3 A1 z r与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。
5 c! D+ }# r M2 \
6 i- p" [: g% u; t! C9 ]" K2 k* o' I7 f, O
3.cell数组相关的函数
9 x' M9 L0 k8 [; Z
) M- ]( p0 z0 { m! ]4 e5 C3 qcell:创建空的元胞数组,预分配内存
6 M# Q/ n0 s$ ]" r: {
8 x; m3 v- | `/ B5 N1 Fcelldisp:显示元胞数组所有内容
" c. a. f: G }, y) V2 x6 p& H7 M( m, s z. w
cellplot:利用图形方式显示内容
6 K" G, [. t; y5 b
* I9 j( q4 b4 c' d3 Y; Z( K z: u* N8 |
: ^ r' z7 a7 F. @$ N/ @cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)
8 P# d0 m5 p3 M, s3 A" }$ d0 }7 {- Q- U2 t+ `& C; T6 M
mat2cell:将普通矩阵转化成元胞数组' D% z/ `) f& C0 v1 C
_( G7 o: x' P- b# x2 d! q
iscell:判断输入是否为元胞数组* u5 C# }+ E& [, x+ T, k6 O% `
; |( G/ Z4 S$ lcellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄9 b( l+ E* s7 f! y; q8 D- P5 `
* J z) [+ C9 b4 ?- ?6 ]; F, kA = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)
, Q9 d( L; v- }' F7 V/ G9 U4 \$ A" z- J4 b H% [4 z; E) L0 M6 _
默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。# @- O" N/ M- i/ ?
0 ~+ ]# Q9 d" V- G/ n支持通过对象数组的线性索引进行赋值+ D4 p2 R) Y7 R9 s: A5 u! p1 M* a
2 x) H- d% p; ?1 e/ O" F具有一个 reshape 方法,可返回与输入大小相同的数组9 o* M( y4 }0 Y$ M0 t
6 Q( s. o; S, K9 a- i8 c. |如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。
& k) d' N7 n' y8 O/ K z
& B2 n+ w( u3 Z. L, \: A& W/ G! _$ I$ @; _ B6 ^: r
b={[1,2,1];[2,1,1];[1,1,2]};
0 L; S4 X& ~9 M8 F2 A4 r6 v# W m3 Y9 ]
! Q" c6 ]$ y" e1 T; m2 |# Qc=cellfun(@(x)(mat2str(x)),b,'un',0)% Y/ u: V! `$ I% X6 {7 j+ f; B1 J
0 L2 C W7 u/ Z ~ R3 Z" Q4 M4 ^ F9 |' r3 {2 j
8 e m+ ]+ ~2 J# D8 i, c# k
* V- ^& e/ y6 ~( G4 M* x9 a) {: P+ {0 X. J/ B; c
更一般的例子参见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
$ d6 @: Y2 g5 ^4 `9 B6 ]/ N
( a8 e2 Y$ y0 ?: h) l% h8 \4.cell单元的删除
V% j8 Z3 Z1 m0 |. |, y! e. v8 _
) l G$ {: W" N8 F' I2 w. i我们知道矩阵及矩阵的删除可以通过[]实现:) f. L2 v* V- E7 [# d6 F
) }+ ?% X( ~- m* B9 L+ q
* E; i K5 K1 e" v$ M4 F
元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()
$ E" {% r4 f6 M4 f0 D* U; R( V
a={1,2,3};
5 W% Z# [4 I1 R6 y) T5 }7 r6 N$ |
: t3 J! s! |) G1 H# q& G8 ea{1}=[];%并不能删除第一个cell单元,只是变成空值- }9 d& w& F, }% c k p! a) S
- e3 G9 o }4 J# Va(1)=[];%删除第一个单元2 C C7 Z+ ^( P( E; K I9 v* P
4 v& p/ z2 |3 W( H, ?7 @4 ?
! W6 E" q- x. U9 ga()=[];%一次性删除所有cell单元, y4 E( X' r8 r2 U, |
$ ~" [& X- z+ b" T' [
# ]8 x: Z0 i% O7 L |
|