找回密码
 注册
关于网站域名变更的通知
查看: 504|回复: 3
打印 上一主题 下一主题

matlab中cell数组用法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-9-18 09:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 faker12 于 2021-9-18 11:02 编辑
  }% @/ l3 c% g$ g$ e/ F9 s/ x. m2 e, z3 R. k- E: V
第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。
4 ~: c) D) N+ v; t& C2 C
: `7 P# ~& b5 q2 O+ Hcell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体7 W4 z: Y% l2 j
# t+ X8 Q/ H, i  y
1.cell数组的创建# J# g. @' ^. V- ]9 I2 Y/ w) {

) N8 h4 b  h5 Q7 L7 ]: x/ ~* [+ f可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};
; a5 H1 G6 _( H( Z! G  g0 I* C! T4 l3 x
也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};# I( ^7 {( {& F" H

  A, }* t7 K# A# S/ u' I" i0 O2.cell数组的访问. m6 I7 s6 ?( @8 ^3 e
1 {7 p5 R# a$ ?1 W4 a  g# v! x
与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。& X1 G; Q- y0 {6 a
5 G4 C' y, `, _- g: D  w
2 y( I* v* v: U1 Z+ k
3.cell数组相关的函数
4 E- z  ?+ }& R- J# o5 a4 w1 g. O' `/ [! K' S
cell:创建空的元胞数组,预分配内存% ?8 C1 b7 S1 z1 b
; f! N! W1 c4 D+ h2 t
celldisp:显示元胞数组所有内容6 q9 X4 l4 y# N( n
% D8 F" o/ f/ K# \. Z" w$ _1 ~) ^$ Z
cellplot:利用图形方式显示内容- i( Z; j1 `3 D" A6 E3 I

! b! n3 `* v' p3 @
2 Q$ c0 T: b% `$ p
cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)
' O) c) l  e8 v  a0 f: g2 }; W& }: ^: Q" B7 {6 K0 I. T7 A
mat2cell:将普通矩阵转化成元胞数组4 F, x+ e+ x( N0 A3 h
; x. N7 k5 f! P) r" x
iscell:判断输入是否为元胞数组
5 u8 M! x( l* r3 F* ]" A& ]8 X( B2 L# k/ ~
cellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄2 U  \: |4 ~$ I+ u; l4 {% C
# y4 X, t1 l# e0 @
A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)
' N) x* [% V9 d  H1 \3 s. \9 V$ D: J4 w) d0 b  c$ }" h; |  D% D
默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。3 Z) }( Z+ Z# W; ?

, K- e5 ^0 @) A4 _% a8 N支持通过对象数组的线性索引进行赋值
0 B4 ?- p: @3 D% ]: _; `( o0 {1 W3 r- D& H
具有一个 reshape 方法,可返回与输入大小相同的数组
/ ^% ~3 E' V5 c- g; a7 I! {6 ^9 v- y
如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。
  ^5 H3 b3 A" s* X# i' X6 a) W6 u. }1 [3 I5 Y1 d% ^$ w
1 ?2 X' E" N* n+ Y- M, l
b={[1,2,1];[2,1,1];[1,1,2]};
: n  m1 G- _" f* ~+ S: h7 Q& A6 Y& \9 T
c=cellfun(@(x)(mat2str(x)),b,'un',0)- c$ S1 K! l: t' W
( }4 b+ r/ [9 S; p
4 G3 S9 B+ y2 |8 P, V% i+ c; i

8 x. u3 k- z) N% ?0 |2 t
+ C( g" _& ^8 [8 j1 s
- w/ B/ L6 j5 o  c+ T% B更一般的例子参见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$ e* w0 {' `: X, q6 V

0 w2 X9 s& \- X4 @4.cell单元的删除
! r7 z2 I# F- s/ q; S. ~& a( W0 `! J: t# u- w$ X
我们知道矩阵及矩阵的删除可以通过[]实现:$ @, d/ ^/ n/ z# v% E
% y& ?6 _2 w9 ^% o3 \" T

; V: x) P. X' Z  O5 t+ A) c元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()/ w  L, m: `! ^- @

3 m1 f6 j. F% A* x8 S$ aa={1,2,3};* A( W( _4 j1 U3 y. B
' R6 ~1 e+ k( d* s
a{1}=[];%并不能删除第一个cell单元,只是变成空值" p: X# L' a( \* }0 J. O' ~0 T7 \" r

0 g  F3 O( Y7 s! f$ i8 h- h' |a(1)=[];%删除第一个单元
5 w) D, m  y/ n# b, X% `( G/ [! A; o' G# i" F( B  h2 K
# ]" H  r. k+ r% j# K: ^, g
a()=[];%一次性删除所有cell单元- `, E5 u. y, E( [8 `( o+ N! [6 w

% T7 j2 i7 o# H3 F) E0 r7 a' z9 F3 @2 _* T6 ~

该用户从未签到

2#
发表于 2021-9-18 11:01 | 只看该作者
cell数组类似于学过的c语言里的结构体

该用户从未签到

3#
发表于 2021-9-18 13:40 | 只看该作者
cell与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容
  • TA的每日心情
    奋斗
    2025-1-1 15:26
  • 签到天数: 584 天

    [LV.9]以坛为家II

    4#
    发表于 2021-9-25 20:44 | 只看该作者
    LZ辛苦,学习学习
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-23 18:48 , Processed in 0.171875 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表