|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 faker12 于 2021-9-18 11:02 编辑 % F# c8 X7 s* ]8 P$ x# J$ D
# l; w3 U* k. \/ k; r; `( N
第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。( B5 c2 T& q1 P* [! v. G
, r& u1 Q8 O- s7 @; D& H; P2 Qcell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体1 u' m2 r# S0 c
, }( O' |; k m1.cell数组的创建
: c a9 A7 m0 v# v _9 E3 V5 s$ L. l+ K) ~ x3 U9 }$ q2 G7 F. a
可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};: w6 X+ U7 x1 ?( V7 F p+ X; H
2 }. s" M/ H$ y也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};
3 F6 g; V, Z) a- X$ y0 O% a8 y5 `
2.cell数组的访问0 J# x* }# l+ W# N
8 V& i& p0 G* z, @4 Z
与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。
! h$ l& y' r+ a# r; ?6 V1 @/ Q
; H5 u Q# K8 G1 t; J0 J: s4 l5 n, C5 X6 j5 `
3.cell数组相关的函数! g! I% @! J# h! ]
% R+ m4 S' Q1 Q4 @cell:创建空的元胞数组,预分配内存
& w$ u* n6 R- {1 T; V: ]& r9 c% |( I% q; Z& L* W1 c0 ]# `6 Z
celldisp:显示元胞数组所有内容
# _0 F/ k5 v5 g; I A- q: ~# f) c5 G$ V. `0 p. X# y" V# B
cellplot:利用图形方式显示内容 o1 w+ q& x w" [
0 k/ ^+ p; X; u& ?# q. a
& i' e* q" P; ~% T) I& Vcell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵), b, C1 p8 P+ c4 o
1 C+ O- _* ?1 b! n9 y1 vmat2cell:将普通矩阵转化成元胞数组
. d2 @6 }# s5 j9 l+ i/ i: [" H1 F
# X8 R5 ]8 `# d' Z5 c' [ o$ [3 Viscell:判断输入是否为元胞数组
9 H) Y; h3 u8 |& V" m
% F" ~) z7 S7 `1 Ocellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄
1 ?3 l* F% ?0 o9 |# L' g# z* q U0 j8 d; S
A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)
5 A2 K! Z$ q% ^& R4 ^+ X8 W: ?$ a( H" } ^
默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。0 R% V9 n: C7 M* p% J+ c+ w
9 X" e' v4 D: ?1 M: L/ o
支持通过对象数组的线性索引进行赋值
/ e1 ?0 Z# i; V( @, C' c& ] e( g* D4 D9 {
具有一个 reshape 方法,可返回与输入大小相同的数组
% W, W' O8 X' L; ?# c3 M6 e$ e8 v: H; R7 J
如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。
, t- e5 ]$ C8 j7 @1 K* o6 m7 m$ `; A: I) t. v* n0 b/ J
8 l9 @* h3 M: h# I. g; w
b={[1,2,1];[2,1,1];[1,1,2]};* }7 S9 c% G4 h% @8 u4 ? X) P
* S; C# V5 W# l% X- v- b* yc=cellfun(@(x)(mat2str(x)),b,'un',0)
+ ~! Z6 b. X; K2 V/ w& }# S - x, B0 }) {- _; R. n
( v0 e, k) Q3 b B+ a9 `
8 |8 {. j- a6 j, p( {0 b
6 J5 Z; g- e+ I1 u, V" v& S
+ _( g% Z# f6 V/ ?7 ~/ N更一般的例子参见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' D1 m% o$ e* m8 g" A, ]) W
L! V; A0 G/ O9 O4.cell单元的删除
5 y$ G( l0 H) L* T
$ G+ S. E( M2 N) Z我们知道矩阵及矩阵的删除可以通过[]实现:
O& B. T& o6 y: F
( u# z Z) ?& {* {" r8 H) F% w8 q, N* R
/ |0 @& y1 T' N$ X U8 \7 z0 G$ N元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()& @7 x! H; h3 } @0 _- v8 D, ]- |9 d
) W1 _; M$ g3 U; R) O8 ha={1,2,3};& S6 b" Q# c @
' ?( P+ i. ^! x5 C
a{1}=[];%并不能删除第一个cell单元,只是变成空值8 Y/ S# N0 }2 y7 n1 n* s6 v* i
0 F! F. J/ f( F) @" R5 u7 K) ka(1)=[];%删除第一个单元4 T/ O; f# `) }5 Q# `" i
1 e7 T/ m; k2 Y/ L
; I: F1 G& Q" n( o. Y1 G9 pa()=[];%一次性删除所有cell单元
+ G! l/ E3 @) x8 B0 y) I* b$ W. d. u1 i1 k
7 R$ m1 p. O+ N$ G |
|