|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 faker12 于 2021-9-18 11:02 编辑 0 D I. c$ C2 t6 a9 v9 [; i. z d
F5 R& C# G: m, k5 B8 q# z
第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。1 c2 R" R$ y9 r
# Y% _; [4 [" R' b' ^5 i5 hcell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体
7 j' c8 K$ A5 e6 |- V# e1 U# k! s1 a5 F/ t/ _3 E
1.cell数组的创建4 y H- n& S; x$ Y- P, c* c
2 R: o: ^0 }! J, ?* z: [1 F
可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};
" `& N2 w6 l r# D7 D- B2 F8 A- n) }7 B" h* E
也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};9 O* K9 S5 u0 m% l6 O
4 E7 F# o7 w4 [7 \0 |* |+ _: B# E3 g$ J
2.cell数组的访问5 v _5 [( S7 U% Q
7 T' N. u9 |, ]# S与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。
( \- L( C! _8 S- R' n0 o# L$ l- G( l) z7 k0 U5 g
# L) l! W3 b( E1 Q# J# ?! q* k1 o
3.cell数组相关的函数
% S5 b: [9 u8 u: a# W* e0 J0 Y$ e4 O9 f5 ~
cell:创建空的元胞数组,预分配内存5 S' Y% N. C0 I/ }4 u0 I' E- P* f1 V
* d3 C1 G/ J" } bcelldisp:显示元胞数组所有内容
+ i( B5 K) p) W8 T, C0 d
( S4 ?! k2 P- Fcellplot:利用图形方式显示内容
% @$ E6 W# {# \0 x! D U9 h& @1 b' ~
$ k: Q9 G. ]/ g- E3 @cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)
* o' f9 l3 j5 z/ |% ^6 d5 V8 X& J& }. a* [7 o0 |# z
mat2cell:将普通矩阵转化成元胞数组
`: _! g) Y+ X+ y0 w) U# I, Q! x% {7 R: Y0 @" C9 r7 a
iscell:判断输入是否为元胞数组 r$ x$ q; [) M5 L8 k4 _- Q7 u
9 `2 g2 }2 H7 O+ m; k3 tcellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄1 q3 |& @0 M2 {5 g2 w! g5 W
: O* h5 M9 ~% [6 Y- Z4 z& ]& k& _
A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)
2 L8 W7 P6 _; B! V! c: x7 `& ?$ t7 l& t( q% Z1 x% ^" \
默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。, u1 Y- H* E5 {+ o5 o
0 {, `. W! L5 X6 j% ?! e支持通过对象数组的线性索引进行赋值
. C& N( v5 P! V( y
6 L- V B/ d/ u: T具有一个 reshape 方法,可返回与输入大小相同的数组 \: ?& u0 S$ ?
8 `8 u5 P1 S0 d b
如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。
8 L( A6 W, s6 ^+ I. U
- F4 P- D+ |8 c6 r( v5 E" g" ?6 l6 X. T3 P# d8 B/ C
b={[1,2,1];[2,1,1];[1,1,2]};3 g# z1 D M* Q o
6 ]4 d4 [2 E H3 z Q5 @4 ^% ec=cellfun(@(x)(mat2str(x)),b,'un',0)
7 P3 z2 i, T6 `9 Z) v5 x+ |0 f$ a" t1 P
# {7 \" N9 |8 S1 V# b. t) p% U
; L5 ^9 [/ D3 _* W
. i' B/ [" P4 I* b6 y; k8 @ + s W* Z9 m) G7 q4 S. b
9 }$ @ i/ l: L* e1 s c+ w
更一般的例子参见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: i" m& X2 H0 Z7 ~
" }+ @# z& E s! z |4.cell单元的删除
8 f1 `- B3 i! W8 L# W3 V" m3 H8 R( c
1 ]' {8 q1 \$ {0 t# G* O% x* j我们知道矩阵及矩阵的删除可以通过[]实现:
2 l! N( ?# v! d: U% E1 S2 |5 J
; w! M4 ~% l! `# c元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()
( V3 ~$ M4 z, P7 O3 |: [5 O l) K
; m2 t. k7 g4 `! |% X5 Ua={1,2,3};0 k5 u" [# @! d
7 X4 C7 x r& ?! ea{1}=[];%并不能删除第一个cell单元,只是变成空值
8 N8 O9 H' {0 P8 L5 y2 d0 d3 N) N) l- Y/ E( h4 e$ s2 m
a(1)=[];%删除第一个单元
( H7 p4 a$ A! J2 s0 J2 E
0 I5 p; w) d5 ~9 b( J
) x4 v! O/ x( e4 X; s# ta()=[];%一次性删除所有cell单元# ]' p% V. d5 P" Z
* R# s. W9 ?! g5 `
H% v& M" K5 T3 Z+ v& Z$ Y
|
|