|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 faker12 于 2021-9-18 11:02 编辑
( C/ A: W+ a" a& i3 w3 N' d; I+ o: k1 }$ h; Z" p; j
第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。
& C5 R& E% m/ A. D$ H1 y3 Q9 S9 F- ]
cell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体$ _' Q' t& C- E* J6 u
$ }; u Z/ D2 ?! U8 h" @! m
1.cell数组的创建3 F/ D( X2 H6 a7 d4 m6 V
6 z3 p- @! I! ~1 N# u可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};
6 K1 l2 T" |- w& p0 p* v7 J, K" z7 ~1 |/ H2 |
也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};1 z9 z! M- y/ m
7 a- i. @5 V& E5 J3 }2.cell数组的访问
! g% Z9 H6 f( V9 _& ], D! H
0 U0 ^3 a. T: ?; b与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。
z# `) u4 K) ?4 [& Y2 ]; Q! c s [1 B4 i: N* Q# L" H
4 V; _( ]. N4 D; [3 _" c3.cell数组相关的函数
2 b: x E' h/ a" N; F0 G* O
. ]( m3 R* K1 ]( [2 Xcell:创建空的元胞数组,预分配内存2 q% p8 E6 q2 O- [9 q2 A9 A
2 u/ l! W3 C6 L; x# A
celldisp:显示元胞数组所有内容- Q+ O5 q J. k. f# z' X$ Y
, `+ L4 k/ L7 D1 Ocellplot:利用图形方式显示内容# `7 S7 u1 l; e: q7 Y
) z6 r4 a5 n3 P
) x6 n* _: l! L' l( Gcell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)
0 x, _. F/ {' `2 ^6 v1 g. S% b8 ?+ Z4 ]* e' l* I
mat2cell:将普通矩阵转化成元胞数组
5 r: }! o! O' M7 U9 c6 Z0 e6 |+ }
' C# [2 ^- t" |0 `% @) ]' Uiscell:判断输入是否为元胞数组
( c3 x: z7 n) e
3 |- r6 s- f5 r' j Zcellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄
2 v' i3 _/ ?" F& K" m0 b3 ~4 Y* L m! h+ q! d8 K
A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)
4 ~+ X1 {1 L1 P1 S' N/ Q- o |, b7 Q; a8 C/ o% `
默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。% D& B0 }: v6 g& _ l! W
7 @; w& f+ n: _支持通过对象数组的线性索引进行赋值
' X2 Y0 x- _" f j& H3 a+ s( Q# c# E$ k& G& j% z' f5 B! l
具有一个 reshape 方法,可返回与输入大小相同的数组 ?% } s2 }6 V# g$ ?
4 k: C/ g* J5 D0 u/ a如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。
* Z% }, N5 L/ E; P# A' i- g5 f3 U. v* ?, h
9 u" e& _/ u4 tb={[1,2,1];[2,1,1];[1,1,2]};
8 C" `8 P- B- H( z& e6 s; S! v9 `' f) U7 v5 X5 A
c=cellfun(@(x)(mat2str(x)),b,'un',0)
; I: t- o3 n8 [" B! p. Q 6 x$ K# A( F$ }" m
. ]& L- [8 h2 R+ [3 c/ Y
" z* D3 x" V9 o5 X4 q+ ^9 ~: M. W
; z5 N6 U" p& z, j4 i- p% Q$ E5 }
1 b4 v% R9 t6 K8 ~8 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
8 p q1 z6 {# O" s5 I8 K. { \4 a; H! O% w6 ~0 f8 K, `
4.cell单元的删除
& i; ?- J8 d1 [: u# J' F' l/ T. f% y
我们知道矩阵及矩阵的删除可以通过[]实现:
4 T( @8 n5 _/ Y" g9 q% V8 c I$ ~) S
3 w4 _6 h( N4 K8 b1 K6 ^
/ T1 U6 N" K: F0 U元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()
1 _* {; w+ M( c$ d7 p: h5 P% n7 O7 Y4 V% x5 ]; c; p
a={1,2,3};
# Q0 V: {8 k. b
|" i h% @/ f4 o' da{1}=[];%并不能删除第一个cell单元,只是变成空值/ x: @$ y& W1 h
' f& ]2 p- |( U, m' B* H: Oa(1)=[];%删除第一个单元
" Z. P _- }4 i5 P9 Y) `5 w! l5 L- @. S; A" [$ x2 j
# \. t* p' r" q( @) s [a()=[];%一次性删除所有cell单元
& e! U" C9 f* j2 c7 H
, R3 o+ ~: i7 p" Z& k! g7 P- b$ u* x- N
|
|