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

matlab中cell数组用法

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 faker12 于 2021-9-18 11:02 编辑 $ l1 r  i& `, _& j( B! D% t
& o/ V( ^/ Y7 G& c# Y
第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。
: l- T$ f: F5 p4 }4 P3 Q
3 ?4 X! h/ x) V0 \cell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体
3 V% }2 ]% I' K5 S8 H9 x
' j( S( t& ^: t3 q* Z# V1.cell数组的创建
. s$ n( [1 E) K: h1 V8 I1 _# U
; P" {% l& b& A- g可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};
8 I! \( v8 t/ d" d& g  n
9 ]0 H6 T+ d+ ], c, L也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};/ `8 ?: ~1 G1 f1 K8 g3 p7 ]

- z2 M& Y. y. c2.cell数组的访问
3 ~) Z* g2 H; X0 f& d$ H4 g& \
; x  a- s$ E6 o' H与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。- C6 P! T; h0 o8 t8 }; d

3 Y, H  n9 E9 G0 t& o! s
1 _8 {7 v. F4 z, \
3.cell数组相关的函数- r0 g2 v; Z/ T$ h8 U8 O# T
4 \0 R" K9 C: i9 z2 @: U* Y8 j
cell:创建空的元胞数组,预分配内存
5 J2 z$ m( R2 u5 I
2 n+ T9 @5 S& t/ Xcelldisp:显示元胞数组所有内容2 Q" K' T3 ~* y/ \

+ ^4 {; m& o9 g4 _- _8 Vcellplot:利用图形方式显示内容; b3 _! @9 j3 u# @- K( s
" e& Y9 C3 l" K+ |5 Q

: A( s$ {) M/ @cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)
: f7 f: t9 X. ]* c6 y& D. p  A# U* R) s  n
mat2cell:将普通矩阵转化成元胞数组
% f9 X# {& j3 h, \9 ]
2 P4 `9 D* t* A% u; h: {3 Oiscell:判断输入是否为元胞数组; ]+ M" d' i9 X0 [# w
' E1 y7 V$ n" W" f4 y" ]7 _0 g7 `
cellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄
$ ?& B% n" G) D' q: r% c9 W+ p/ @0 R2 s
A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)
" C9 Q- M8 V& z  W. u# t
  k6 t! P- J, J  [5 _默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。
4 p% h. s6 R! @7 ^
7 Z- V/ Z9 O  m支持通过对象数组的线性索引进行赋值
' A; U* s" w0 g) k2 O- K1 X
4 z4 e; n% `/ g8 m' E7 P具有一个 reshape 方法,可返回与输入大小相同的数组5 U) |9 [! j3 ?2 t. b; y/ I' l

. [' D, v+ ?' f% L1 t如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。
" H+ _* j4 a) [8 H7 d" F% e. j4 }" t( L8 L! H
; V6 }$ p% I) ?- T# D
b={[1,2,1];[2,1,1];[1,1,2]};4 f8 S; K( }8 [* ?/ k0 T! P3 ?0 Q% I

7 _: l" f% Y; w  i$ J) f6 [c=cellfun(@(x)(mat2str(x)),b,'un',0)
6 G8 C9 R" m  }7 v 6 X9 a' R. k8 s( S: B, c2 R

- }' Z8 m, B* c, n. }) d+ x) d( v; l$ p  _) R+ |

9 O/ P0 z+ u2 ]3 D4 Z( |
' H5 ~, }* M5 `6 b* J1 l更一般的例子参见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
" N! n! ~, p8 G+ |7 p
% G+ _7 Y) g: u6 H% E0 I  [" J: y. W9 ?6 O4.cell单元的删除; C# u( c8 `: N4 _! q& v' m9 C
4 k) r" k- t7 x7 V# R1 m
我们知道矩阵及矩阵的删除可以通过[]实现:: E2 `2 o* N! T& @5 q) w

& \6 f/ E) I5 i6 h1 `
' G: V6 L* e% p  U+ a4 |' y8 B/ c
元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()8 e2 _4 E, C! J! k7 N
- l- X* G6 W. p/ ~
a={1,2,3};
3 n+ j% V( _$ d% k
/ R# C+ {+ |( }: Ua{1}=[];%并不能删除第一个cell单元,只是变成空值
9 ]3 D6 k0 m, c3 s, y' f% x  @* g
/ r/ H; u- n7 k3 p% g: L6 Ya(1)=[];%删除第一个单元  C5 D$ G# \& c- V2 O

* D4 J6 B7 r# A+ }

( @: K$ h: d* C( z2 n5 H  ^8 ~& Y) wa()=[];%一次性删除所有cell单元
" E& t" ~" Z; n/ C0 I. z8 Y. J" X: [% ?1 b* K5 M7 l
8 m. a) e- N9 w7 I( l2 H

该用户从未签到

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 21:58 , Processed in 0.156250 second(s), 27 queries , Gzip On.

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

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

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