|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 faker12 于 2021-9-18 11:02 编辑 3 K! R/ u; v, m* Z
/ Y! q, b* \- n# `* G5 ~
第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。
) d, G2 F9 k0 k3 w) {) ~6 |% a
4 k' \- G# ^# t/ wcell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体. k, w( ]9 c5 F. b
! }4 h3 n6 V3 `& R
1.cell数组的创建
4 N, C" m% b. j0 Q3 b+ g5 s: H+ z( H& t+ I1 X2 T
可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};+ g% n2 \" k% h2 `8 p* F* M J
; |: l0 v$ v/ U
也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};3 {$ j' _! \; p" s, _, H% Y
4 v, }) E( Y# e! O# \( z2.cell数组的访问
, P4 K( a. V: W1 B, P$ v6 D- ^3 X! d# l' r. I$ P% n# K
与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。( S+ |" F, V7 N
7 U X& i0 a$ k: P; O* U; T8 |- X
( ^5 a8 R: @! o: f T( j1 y
3.cell数组相关的函数 r( R. x+ P6 n( F1 r9 ]0 t A% q
( J. [6 |) N; t$ ~& K. P- Q
cell:创建空的元胞数组,预分配内存: ?5 c/ R% C+ j6 C0 n( S, x
2 `- ?$ y1 r2 b: l) i8 W
celldisp:显示元胞数组所有内容
! W. J( {' M, v6 T+ y Z; r# W5 G( _0 r" H( m( q# a- V5 P
cellplot:利用图形方式显示内容
. u5 Y4 b- M/ T4 w7 `0 E
4 V# b- o, X% d' @1 D. D. G) U
. x9 f8 I& Z7 a! s6 i4 W8 J9 Tcell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)7 A& ]. J: s q* I+ G1 @8 I! h' l
' r; [) |8 _9 ?6 @ m
mat2cell:将普通矩阵转化成元胞数组. g5 e4 ^" m& ?
2 `' q' {2 U8 u N) q- Discell:判断输入是否为元胞数组
4 x. M u# f- K \2 L" O$ W2 s' q3 X9 p6 J- V9 s, A: o( \8 |' p
cellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄
* i, e% R; o* ^8 f# V" p0 {7 S$ `! I; r9 Y- A$ f
A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)
0 f9 g) y( [: Y, K& f( A
0 E6 k& ~' g9 e默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。
% f+ v6 ^; W5 `, v1 }6 v( x
) H; X$ X! O" Q Z8 w) G支持通过对象数组的线性索引进行赋值# D* e) x8 l; b! ^1 N
) `- c3 }# T9 Q1 q+ I* W" A2 y具有一个 reshape 方法,可返回与输入大小相同的数组$ j9 O7 `: f' x) x# x
. w( z( l) M8 W+ l
如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。: g2 L' i+ q2 |( P
: R7 l3 h$ _4 c8 r: _$ }7 c) t6 D
b={[1,2,1];[2,1,1];[1,1,2]};
4 O' N# w8 X# R3 ]0 X$ f, l1 P( ^ N1 {) i+ x0 B1 z( n1 m
c=cellfun(@(x)(mat2str(x)),b,'un',0)
& S0 B9 d5 S2 X+ b! x, a/ d1 m
5 d" ~% D, g& j2 ]* k7 L0 v/ v$ J( B4 s/ H N& f: D
3 d1 @, Y9 R b6 k- C' @& ?
. v6 S6 I0 l+ w2 n* j$ Z0 K# ?; b$ z" b- t) Y6 }; ]8 \7 ?
更一般的例子参见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
6 K- Z1 e. D1 c! l& q2 H9 Q$ [; Y( ?( [" Q, ?
4.cell单元的删除! d: q( J: I- E) y. B7 m4 E% Z% q
" s* f9 q2 x2 ?! j. V% T) l: `0 l我们知道矩阵及矩阵的删除可以通过[]实现:6 t# Y: C6 k9 M% \& a
% k# x6 M2 I! z0 b
! e' |2 Q1 x; r) C元胞数组操作类似但和其赋值一样有区别,区别就在于{}和(); W/ P" U# {, J% n' P
0 w# A9 Y" S) d
a={1,2,3};' r' F9 |6 {% z: _% |
* M8 l# v" B8 z% s* b
a{1}=[];%并不能删除第一个cell单元,只是变成空值1 Y. m- |; Y0 x1 Z* W8 G$ g+ m4 r
: n; v3 p0 t& g2 O& B9 ^a(1)=[];%删除第一个单元
: e" `& r: D) d9 I
3 @1 D$ Q# q& C- A( h+ q, `! ]5 l+ j( l2 i% T, U$ n
a()=[];%一次性删除所有cell单元
0 D) x+ J4 F- a" E, K) t4 p8 L3 g C* F( E, d8 F6 v/ z; d
: K7 y& D! S( R |
|