|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 faker12 于 2021-9-18 11:02 编辑
3 i9 |3 Y3 _2 r/ d, Z
" X8 v$ I+ c2 Z. B+ w, \第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。
/ j+ B' ]1 N' L5 `; f+ ]( t, o, B/ X
7 N8 e B3 m3 K0 ]cell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体, u4 L: d4 w4 T8 N, d0 ~
8 p( W' J# p9 j9 ]5 l, a
1.cell数组的创建: \9 F$ @. b; q# m# H" H' m1 Q& g. m
8 }0 s* l. |0 c, m9 T可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};
' D- l- {9 U% n
+ m# S+ |. a# W2 {- R也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};
% u5 g: t/ M2 L1 f# I5 U$ M* s
2.cell数组的访问
: W. z2 K# I( J% [1 _! y. s0 ^! |% K C7 t( g6 E6 x2 W
与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。( Z& H: g) F3 I" q( g; W9 u3 Q( _5 V
. f2 N7 K1 c, U2 d- V% c: P: V: U# ~1 K9 J+ Y7 Q! |/ f* v
3.cell数组相关的函数0 |) Z g: w/ [7 v" t w1 D: z
, G) i6 c+ c6 H: A" `: y# h7 U
cell:创建空的元胞数组,预分配内存
9 d, g- f. N! V, A" } ~( u" X& T4 O$ W7 [- [
celldisp:显示元胞数组所有内容) {1 e# y( P7 a8 _1 h) N0 ]* M
. Q- G- b8 q" L0 Ncellplot:利用图形方式显示内容
" [ W5 P- l# N4 ?
' l% {, L# C9 ?3 j& h$ j0 e1 |9 d& Q/ Y/ J
cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)
$ r8 W* u3 m# \8 a r( `
3 C7 X! r) j2 M6 E$ R+ Imat2cell:将普通矩阵转化成元胞数组& p- f0 Q5 p7 J& @2 K1 ?6 `
/ u' Y' d' X3 o" Z6 b. d
iscell:判断输入是否为元胞数组
9 o0 u# {3 x& V7 ~- o0 C; X9 X6 L" {3 J
cellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄. c9 x" x* z, j" n. b+ R
9 U# S0 _4 U; A: [0 q( }8 o5 f- e
A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)& x- C6 A' f5 F4 u2 x
( ~7 |1 h8 u: B9 y" ^/ Q$ F默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。
* J' B% V7 \4 G2 n E9 o- k8 R# [6 h* o( _
/ E3 Q0 T, O: X5 F5 I! x支持通过对象数组的线性索引进行赋值1 M, ~2 S% R" P- R
9 L" k2 c2 i( L) x具有一个 reshape 方法,可返回与输入大小相同的数组
R/ k4 F+ l, ]0 P4 l+ j- G0 X
- w0 j- j7 _# @' g如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。# {, n- F& ]/ V5 |) g
H3 x# X, ]% m. `& S
a4 m% ^- f0 J3 Xb={[1,2,1];[2,1,1];[1,1,2]};
, Q4 I% }( @/ I4 B6 z/ g5 s/ ^3 p- x
c=cellfun(@(x)(mat2str(x)),b,'un',0)
1 I5 e9 l: J# A& z: B7 C4 J
$ c% \: z: h7 b' ]. A) q
. d1 c/ F2 e/ @8 V9 S5 R; ] {
+ A6 ~8 c4 ~ h* S" n# B 8 }' `; c% w4 l7 J3 [# b
7 m8 [+ q& q( B( H
更一般的例子参见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! y1 a3 X" @+ X* f5 d
+ C- F+ Z/ u0 r4.cell单元的删除- f$ y+ u, G1 D
9 G2 \$ U; q7 ?$ e我们知道矩阵及矩阵的删除可以通过[]实现:
# I6 \# D% e! d* L3 K6 N$ j; v3 {; p5 A A: U
2 k. I2 y% g' {7 N
元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()
8 o" G i" S9 m; a# ~; p; t7 M# a- y" B5 L% L7 f, M* A" t2 t- w
a={1,2,3};
* B8 E( F* u/ X4 x: F0 v- J! Q. K
! M. u' G" F' H+ {& aa{1}=[];%并不能删除第一个cell单元,只是变成空值% u [, A+ x# G0 H6 r
& P5 ?* V& _% ~4 ~* da(1)=[];%删除第一个单元
! }! k8 m# v W
0 B. k# q7 g$ m0 y2 y$ Q- E
8 y6 E- y, g8 o0 {6 j5 h8 La()=[];%一次性删除所有cell单元
$ o$ o6 C' ~* i% A+ h
, j1 \1 ?6 R+ N. G1 X
# E5 q7 p M/ V8 {6 C" V8 _8 P |
|