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

matlab中cell数组用法

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 faker12 于 2021-9-18 11:02 编辑
2 `& @& ?- Q. s. ^9 L% e8 V  K& J1 S- K5 I' d
第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。0 P! y! s1 i1 ?  f4 m

% E1 m  P4 W) t& A" ~3 ecell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体
9 i, M: F7 ~  Y1 v  W1 I3 `' |6 m  S7 Y- }* X
1.cell数组的创建
9 o" d- T& e' Q& f. K: l3 r0 d# [# ^1 T0 ~6 ?  o) ^7 r
可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};
/ @" t$ n5 b8 G  P/ G2 N7 m. T
& o0 }! G3 L0 q" F$ f5 w" a也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};3 f/ r% ?# s" a5 ~6 f

* h& b) \* M1 ~. |' y& U) G' R4 G2.cell数组的访问" ~1 R/ M3 n/ T* i( }7 k
; H* m' t, V$ _( x3 Q( o
与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。: g! v: `4 o) d9 L0 f: [/ r6 B

3 b" ^; m. D! w8 C1 C/ h8 h
5 g# m' E0 @. O9 {4 \$ l
3.cell数组相关的函数
. M9 `5 w) c3 |' A9 P# h
+ D+ B+ ?: c  I/ P$ ocell:创建空的元胞数组,预分配内存
# _, o" G: `; q; |: V
8 h  C2 c& h# n. w' B: }celldisp:显示元胞数组所有内容1 O* h* O# f- t0 B" r* Y
0 J! Q5 m' ^- O3 a# H+ g+ _6 a
cellplot:利用图形方式显示内容
& ?7 m. S- z, v& Q( H4 H4 Y8 i* q$ {# T  h6 @! z8 f
3 U8 y% `" w/ D8 Z
cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵), \/ x) ~$ o) w0 O5 E: Y7 h
; T& c7 K0 r4 }+ X" n
mat2cell:将普通矩阵转化成元胞数组
3 V/ ^* n( J; p+ m% v
' I+ {7 _! M% x" ^$ a& L. fiscell:判断输入是否为元胞数组. Y9 d3 V5 r+ |

7 I0 `7 U: n/ acellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄8 [, @1 `. I1 q, X1 c

8 r. k( A' A, q/ s  I2 m3 ~A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)  p) l) ]* r8 ]; b
) f  z; o0 X9 e
默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。$ m# U5 h+ Z! S0 p: F" E+ ^; }

9 e# I9 M- o0 {8 d  r. l支持通过对象数组的线性索引进行赋值
# v4 h0 }4 j/ q* Q. u
& M- a; t5 i5 t- G' H具有一个 reshape 方法,可返回与输入大小相同的数组
1 S& w4 [7 {2 J6 G3 D& x, U5 k9 M# m* n' g- |0 L/ m
如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。
2 _  l. m: C; W2 z0 P
; u2 S4 E6 v5 q0 W; D# z' }
5 Y8 |$ l' R5 O* E. F, ~1 w3 C- Eb={[1,2,1];[2,1,1];[1,1,2]};
8 G3 B3 \0 @* t# J' Z9 U; E$ X! d4 u
c=cellfun(@(x)(mat2str(x)),b,'un',0)4 K" e% W  b% h8 P5 c

8 B7 N+ a7 [- @0 S2 \$ n. A
: Z: x) E) u& ^  B& d

; E/ F7 ~1 E$ e7 o5 j0 v ; t3 Q- |0 A$ e3 V- k! O# T
+ A* f: m2 ^$ X
更一般的例子参见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
' p5 {% q$ B6 w9 M2 S5 T' Y) A/ Q1 |. ^" u. i% w; s
4.cell单元的删除
# o1 h- ~) i$ l) a$ ~) `/ z' q7 F  s! H  ^; ~
我们知道矩阵及矩阵的删除可以通过[]实现:. l. S1 S$ L2 N! d: v
; g% a! Q& z0 F+ A% D

; w8 i3 u% [: a6 Q* u$ F元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()4 G- P- K1 Y; C& T! J
+ h8 F2 Y% {1 d4 \3 q# l) s5 ~
a={1,2,3};
- U0 f) b( R; c' I( y9 \; ]7 L: x4 h& m% T2 U2 j2 S' q- W
a{1}=[];%并不能删除第一个cell单元,只是变成空值* g5 _" l7 l( p% W
( Y1 ~. u' W$ q! X: A. ?0 S
a(1)=[];%删除第一个单元: x% |0 v9 [- ^0 w9 k

9 d1 [& \8 E* o, e$ h
/ P- H; p! G1 q; p
a()=[];%一次性删除所有cell单元
  }! D2 n9 O; e0 J9 ?9 s5 w* P4 o& s# T! M8 x) {1 c9 N# o

3 U$ z: O1 n8 m$ C9 C8 t# p

该用户从未签到

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 19:32 , Processed in 0.171875 second(s), 27 queries , Gzip On.

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

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

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