|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 faker12 于 2021-9-18 11:02 编辑 : N8 O% f, s" |* i7 v1 i" }% M
' V( N: P; k5 x! W第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。
, k( C, R0 j8 {$ [% w1 e+ C _3 z. {. u7 ?: V/ P
cell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体
6 | E. U4 i+ E# Z& ?* `( \7 D: Y+ Q# c: k
1.cell数组的创建& R% E* d2 C) W/ _
% P% t3 f( R( d; J1 M可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};% @; k' n) J; H4 _
& m- j2 s n( r V7 I也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};3 _% r y7 X; U$ Q# z! L5 |* X$ \
& ?5 i. p- O! R& f- t9 w( a+ _2.cell数组的访问
) k8 T; }2 {4 ^0 n# }5 H
6 \: x% B- x( e, f' V( f) [与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。
6 R5 h- O- a5 X u# ^' B1 Q. S$ c! B: n* a" [# j
' ~( @4 C& a C/ C3.cell数组相关的函数
$ W. u. L5 q8 P+ A1 F1 q; @! I5 R4 m1 b3 z3 J
cell:创建空的元胞数组,预分配内存% n( n# I- [# Y/ |' ~0 U
' d' q$ s" D* j/ l- Y$ c7 Ccelldisp:显示元胞数组所有内容7 C- {" Y$ B \( \7 U- P- z
! E- {7 n* F7 b; x
cellplot:利用图形方式显示内容- P5 l' L2 c4 m6 P+ ?9 ~
) Y' N! x) z/ F$ l2 e0 [
3 a1 t% E' B9 e4 G5 w/ L
cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)
; t8 G/ Y! B$ |" r2 L' i$ s5 _8 _, }/ x
6 \" o g7 i, |. ]mat2cell:将普通矩阵转化成元胞数组2 c5 _8 g1 i3 k6 q( [
$ a. H4 C: i8 ]' Y% ~, Liscell:判断输入是否为元胞数组
: k! B0 S0 f6 C7 H9 ~# e, t2 x) `( S w4 G; x" g4 D
cellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄
/ ~8 h0 R* v8 H c
2 z8 |" U% Q; n' TA = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)
1 X( F' F% K7 L7 ]0 }( e9 y8 W9 O% E" i5 k9 X/ H" G+ _& g
默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。/ s0 N( |+ D3 L$ I& N) n3 r
+ E2 j) f3 |9 x7 ~$ j3 i4 M. b支持通过对象数组的线性索引进行赋值
6 v& F1 m9 O6 I, [
! h# {# \" z& O. X6 j具有一个 reshape 方法,可返回与输入大小相同的数组5 O6 j, ^0 j1 l
- b- B+ P4 x+ P2 q如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。
7 S: h; t- X% Z
# j/ E/ `+ [* m9 L9 c
6 i/ H$ D* s9 H) ib={[1,2,1];[2,1,1];[1,1,2]};+ B/ `$ f: }, l
4 D* U2 C# s2 Y0 j" D) j) sc=cellfun(@(x)(mat2str(x)),b,'un',0)& ]$ f, A9 D( n/ t& k* j! j( Y$ v
' @3 d2 L; p1 C/ l4 Q- a) {* x
$ k* T; Y) _1 {; s x8 S; n' B; ?0 P* U- u( x
0 B" |7 w& Z: w6 f& V0 X# Q8 ?2 f
. m# B5 X1 p5 P& P4 |- }8 ~更一般的例子参见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* T7 G* Z; v: R1 v! }
* ] F9 F6 i: u4 E, I/ |* @4.cell单元的删除: u* P7 H" w$ S
- n- u9 y: J/ ~5 [5 a( t1 S我们知道矩阵及矩阵的删除可以通过[]实现:) n# n; Z2 N& ]) @; N# c$ K
" Z- F, e" ^, ^, H1 m/ S" q9 a6 ^0 A
/ |% k1 H7 p) _元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()
, I, j3 s m& |7 o- j p; c' ?% g# _
a={1,2,3};
! G3 d V; w& V& j* J
- O$ v# V) m1 j9 F5 xa{1}=[];%并不能删除第一个cell单元,只是变成空值' M: t3 U. J% }- `; X) j" w
) C8 U! _0 d a2 h0 w; Q0 Qa(1)=[];%删除第一个单元
4 i# @7 {0 a: ]$ L' c+ ` d
3 |$ @/ {0 _; }8 C! O% i7 x9 b" N ^9 i
a()=[];%一次性删除所有cell单元
0 x; a. T8 j, r( F, W; w! j9 h; R
( l' \6 O5 y$ S) |3 @. V$ _/ N# R& i# w2 a" P/ z
|
|