|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 faker12 于 2021-9-18 11:02 编辑 : B k9 B% q0 W
& ]; P+ }; i6 J) O第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。
$ c7 c- ~( k1 H+ G5 x) i" @, F
% z, c: o% }: M7 lcell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体
$ G0 \, m5 P! K. Z# O( f+ g9 [% P: ?* W6 y% i
1.cell数组的创建
& {0 B* B) t0 H3 o% W" J: o% O. V) |! o+ p0 Q" q
可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};
& B0 y# y/ R% K4 u2 q9 @% b( ^
; r3 t6 Q, _1 t7 C也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};
# x' u* Z5 b, H# `+ a! l7 Y) a8 Q. p. U8 c
2.cell数组的访问
6 J5 G2 Q8 [% a+ U. o; s3 _" D3 L
+ P3 a$ E! o0 ~7 L$ ]/ V- {与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。( U0 N% T& C2 Z7 y8 Y7 l
. o2 M% ^( B% G6 K) @. `
: E0 } V9 P7 M+ z. `3.cell数组相关的函数2 B' Y8 x: @5 K. u- i" k
/ C; e+ F$ D, C4 s/ A
cell:创建空的元胞数组,预分配内存& x% D; f, ^3 C
. ~# i8 M! ^) Q& U2 j
celldisp:显示元胞数组所有内容
3 X' E1 k) ?+ W. b
3 U6 O/ M# _' A" }/ e7 P) k5 tcellplot:利用图形方式显示内容
2 r/ O9 S; u# n: @$ W. E( B& i& j: I5 R) \! p
# y! N% {3 V# D ^, C
cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)8 A' \$ q) f/ ~4 t6 d
" I, E! p$ R9 o% ~) nmat2cell:将普通矩阵转化成元胞数组9 s* j2 J- V0 z) ^. m
6 ?3 K3 o+ J4 G. w' S. j* h! z. C
iscell:判断输入是否为元胞数组
! L; ^( n" X6 u" n4 `; b
+ {/ x3 Q. Y0 O) I8 w$ {0 kcellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄
& \; o% ]9 A; F/ c/ D4 g. Y
/ j( M/ q3 B5 x* b2 CA = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)
: U$ c5 S( F% q3 F) B2 c
. N- l @8 L4 Y& w# y5 e) C默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。" U7 }8 _) K# x& z& x1 \
* B* Z7 \$ \4 X) ^6 b支持通过对象数组的线性索引进行赋值
- t+ r6 w' j/ ~. \2 W
# U1 K5 M( V6 m具有一个 reshape 方法,可返回与输入大小相同的数组
+ O1 `$ G& l( W- v/ I- q# R: h0 S) K/ S. D; v4 i
如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。
' i/ O3 P# H& X/ H+ e, L C5 s" ?. l( D9 N! S
( E6 ~" i4 U1 x. f) k6 Q- b
b={[1,2,1];[2,1,1];[1,1,2]};4 k5 Y6 l$ {4 o
& i( l0 D6 _- W9 M
c=cellfun(@(x)(mat2str(x)),b,'un',0)
' F! b8 B7 h: f* K ! j' f, I3 w4 D: U4 U$ @
3 u2 D# Y! P6 n5 k3 V: P
) _* B; K5 x5 z; F1 q: {6 A3 G4 G& o
9 I& @$ F" Q: \
. F0 H- H. G/ h) }* 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
( U; D I. E' S" F) e5 U$ H1 t5 P
4.cell单元的删除9 v1 g) m+ r* _$ B0 m! A% \
1 ~5 Y( T& G8 [! V j我们知道矩阵及矩阵的删除可以通过[]实现:6 j i, Z. u) y' r
' d5 Q+ _, i0 T* Y R
, P/ @/ d$ \7 ?3 R7 u/ j元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()& j- f. z6 ^6 f# {7 H8 v
! _; s+ D, Q8 g8 ~3 _, u1 V* L1 O+ Ca={1,2,3};& w: s7 ~" r+ h% _+ U7 D1 B0 V0 y
' b+ P% Z8 c1 L: p2 v
a{1}=[];%并不能删除第一个cell单元,只是变成空值% [, t5 y6 h: J, m0 a8 R4 { x
* g9 {" U! r1 u* a; m: y! Fa(1)=[];%删除第一个单元& g* h# O. Z# j4 ` G2 ^* z1 {4 i
' ?( }) J2 @0 q7 _: O: g
. D" |3 T7 `% L1 }a()=[];%一次性删除所有cell单元
8 n# n/ B9 @* j0 P6 Q
! p9 ]: Q/ g, Z1 Z$ i( y
Z) o" ~( n6 R3 v |
|