|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 faker12 于 2021-9-18 11:02 编辑
2 `& @& ?- Q. s. ^9 L% e8 V K& J1 S- K5 I' d
第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。0 P! y! s1 i1 ? f4 m
% E1 m P4 W) t& A" ~3 ecell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体
9 i, M: F7 ~ Y1 v W1 I3 `' |6 m S7 Y- }* X
1.cell数组的创建
9 o" d- T& e' Q& f. K: l3 r0 d# [# ^1 T0 ~6 ? o) ^7 r
可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};
/ @" t$ n5 b8 G P/ G2 N7 m. T
& o0 }! G3 L0 q" F$ f5 w" a也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};3 f/ r% ?# s" a5 ~6 f
* h& b) \* M1 ~. |' y& U) G' R4 G2.cell数组的访问" ~1 R/ M3 n/ T* i( }7 k
; H* m' t, V$ _( x3 Q( o
与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。: g! v: `4 o) d9 L0 f: [/ r6 B
3 b" ^; m. D! w8 C1 C/ h8 h5 g# m' E0 @. O9 {4 \$ l
3.cell数组相关的函数
. M9 `5 w) c3 |' A9 P# h
+ D+ B+ ?: c I/ P$ ocell:创建空的元胞数组,预分配内存
# _, o" G: `; q; |: V
8 h C2 c& h# n. w' B: }celldisp:显示元胞数组所有内容1 O* h* O# f- t0 B" r* Y
0 J! Q5 m' ^- O3 a# H+ g+ _6 a
cellplot:利用图形方式显示内容
& ?7 m. S- z, v& Q( H4 H4 Y8 i* q$ {# T h6 @! z8 f
3 U8 y% `" w/ D8 Z
cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵), \/ x) ~$ o) w0 O5 E: Y7 h
; T& c7 K0 r4 }+ X" n
mat2cell:将普通矩阵转化成元胞数组
3 V/ ^* n( J; p+ m% v
' I+ {7 _! M% x" ^$ a& L. fiscell:判断输入是否为元胞数组. Y9 d3 V5 r+ |
7 I0 `7 U: n/ acellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄8 [, @1 `. I1 q, X1 c
8 r. k( A' A, q/ s I2 m3 ~A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释) p) l) ]* r8 ]; b
) f z; o0 X9 e
默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。$ m# U5 h+ Z! S0 p: F" E+ ^; }
9 e# I9 M- o0 {8 d r. l支持通过对象数组的线性索引进行赋值
# v4 h0 }4 j/ q* Q. u
& M- a; t5 i5 t- G' H具有一个 reshape 方法,可返回与输入大小相同的数组
1 S& w4 [7 {2 J6 G3 D& x, U5 k9 M# m* n' g- |0 L/ m
如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。
2 _ l. m: C; W2 z0 P
; u2 S4 E6 v5 q0 W; D# z' }
5 Y8 |$ l' R5 O* E. F, ~1 w3 C- Eb={[1,2,1];[2,1,1];[1,1,2]};
8 G3 B3 \0 @* t# J' Z9 U; E$ X! d4 u
c=cellfun(@(x)(mat2str(x)),b,'un',0)4 K" e% W b% h8 P5 c
8 B7 N+ a7 [- @0 S2 \$ n. A: Z: x) E) u& ^ B& d
; E/ F7 ~1 E$ e7 o5 j0 v ; t3 Q- |0 A$ e3 V- k! O# T
+ A* f: m2 ^$ X
更一般的例子参见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
' p5 {% q$ B6 w9 M2 S5 T' Y) A/ Q1 |. ^" u. i% w; s
4.cell单元的删除
# o1 h- ~) i$ l) a$ ~) `/ z' q7 F s! H ^; ~
我们知道矩阵及矩阵的删除可以通过[]实现:. l. S1 S$ L2 N! d: v
; g% a! Q& z0 F+ A% D
; w8 i3 u% [: a6 Q* u$ F元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()4 G- P- K1 Y; C& T! J
+ h8 F2 Y% {1 d4 \3 q# l) s5 ~
a={1,2,3};
- U0 f) b( R; c' I( y9 \; ]7 L: x4 h& m% T2 U2 j2 S' q- W
a{1}=[];%并不能删除第一个cell单元,只是变成空值* g5 _" l7 l( p% W
( Y1 ~. u' W$ q! X: A. ?0 S
a(1)=[];%删除第一个单元: x% |0 v9 [- ^0 w9 k
9 d1 [& \8 E* o, e$ h/ P- H; p! G1 q; p
a()=[];%一次性删除所有cell单元
}! D2 n9 O; e0 J9 ?9 s5 w* P4 o& s# T! M8 x) {1 c9 N# o
3 U$ z: O1 n8 m$ C9 C8 t# p |
|