找回密码
 注册
查看: 450|回复: 3
打印 上一主题 下一主题

matlab中cell数组用法

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 faker12 于 2021-9-18 11:02 编辑 0 D  I. c$ C2 t6 a9 v9 [; i. z  d
  F5 R& C# G: m, k5 B8 q# z
第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。1 c2 R" R$ y9 r

# Y% _; [4 [" R' b' ^5 i5 hcell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体
7 j' c8 K$ A5 e6 |- V# e1 U# k! s1 a5 F/ t/ _3 E
1.cell数组的创建4 y  H- n& S; x$ Y- P, c* c
2 R: o: ^0 }! J, ?* z: [1 F
可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};
" `& N2 w6 l  r# D7 D- B2 F8 A- n) }7 B" h* E
也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};9 O* K9 S5 u0 m% l6 O
4 E7 F# o7 w4 [7 \0 |* |+ _: B# E3 g$ J
2.cell数组的访问5 v  _5 [( S7 U% Q

7 T' N. u9 |, ]# S与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。
( \- L( C! _8 S- R' n0 o# L$ l- G( l) z7 k0 U5 g
# L) l! W3 b( E1 Q# J# ?! q* k1 o
3.cell数组相关的函数
% S5 b: [9 u8 u: a# W* e0 J0 Y$ e4 O9 f5 ~
cell:创建空的元胞数组,预分配内存5 S' Y% N. C0 I/ }4 u0 I' E- P* f1 V

* d3 C1 G/ J" }  bcelldisp:显示元胞数组所有内容
+ i( B5 K) p) W8 T, C0 d
( S4 ?! k2 P- Fcellplot:利用图形方式显示内容
% @$ E6 W# {# \0 x! D  U9 h& @1 b' ~

$ k: Q9 G. ]/ g- E3 @cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)
* o' f9 l3 j5 z/ |% ^6 d5 V8 X& J& }. a* [7 o0 |# z
mat2cell:将普通矩阵转化成元胞数组
  `: _! g) Y+ X+ y0 w) U# I, Q! x% {7 R: Y0 @" C9 r7 a
iscell:判断输入是否为元胞数组  r$ x$ q; [) M5 L8 k4 _- Q7 u

9 `2 g2 }2 H7 O+ m; k3 tcellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄1 q3 |& @0 M2 {5 g2 w! g5 W
: O* h5 M9 ~% [6 Y- Z4 z& ]& k& _
A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)
2 L8 W7 P6 _; B! V! c: x7 `& ?$ t7 l& t( q% Z1 x% ^" \
默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。, u1 Y- H* E5 {+ o5 o

0 {, `. W! L5 X6 j% ?! e支持通过对象数组的线性索引进行赋值
. C& N( v5 P! V( y
6 L- V  B/ d/ u: T具有一个 reshape 方法,可返回与输入大小相同的数组  \: ?& u0 S$ ?
8 `8 u5 P1 S0 d  b
如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。
8 L( A6 W, s6 ^+ I. U
- F4 P- D+ |8 c6 r( v5 E" g" ?6 l6 X. T3 P# d8 B/ C
b={[1,2,1];[2,1,1];[1,1,2]};3 g# z1 D  M* Q  o

6 ]4 d4 [2 E  H3 z  Q5 @4 ^% ec=cellfun(@(x)(mat2str(x)),b,'un',0)
7 P3 z2 i, T6 `9 Z) v5 x+ |0 f$ a" t1 P
# {7 \" N9 |8 S1 V# b. t) p% U

; L5 ^9 [/ D3 _* W
. i' B/ [" P4 I* b6 y; k8 @ + s  W* Z9 m) G7 q4 S. b
9 }$ @  i/ l: L* e1 s  c+ w
更一般的例子参见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: i" m& X2 H0 Z7 ~

" }+ @# z& E  s! z  |4.cell单元的删除
8 f1 `- B3 i! W8 L# W3 V" m3 H8 R( c
1 ]' {8 q1 \$ {0 t# G* O% x* j我们知道矩阵及矩阵的删除可以通过[]实现:
2 l! N( ?# v! d: U% E1 S2 |5 J

; w! M4 ~% l! `# c元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()
( V3 ~$ M4 z, P7 O3 |: [5 O  l) K
; m2 t. k7 g4 `! |% X5 Ua={1,2,3};0 k5 u" [# @! d

7 X4 C7 x  r& ?! ea{1}=[];%并不能删除第一个cell单元,只是变成空值
8 N8 O9 H' {0 P8 L5 y2 d0 d3 N) N) l- Y/ E( h4 e$ s2 m
a(1)=[];%删除第一个单元
( H7 p4 a$ A! J2 s0 J2 E
0 I5 p; w) d5 ~9 b( J

) x4 v! O/ x( e4 X; s# ta()=[];%一次性删除所有cell单元# ]' p% V. d5 P" Z
* R# s. W9 ?! g5 `
  H% v& M" K5 T3 Z+ v& Z$ Y

该用户从未签到

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-6-1 03:29 , Processed in 0.078125 second(s), 26 queries , Gzip On.

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

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

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