EDA365电子论坛网

标题: matlab中cell数组用法 [打印本页]

作者: faker12    时间: 2021-9-18 09:46
标题: matlab中cell数组用法
本帖最后由 faker12 于 2021-9-18 11:02 编辑 3 O% I: r1 |5 v  z1 F0 [6 E5 l

/ D2 s& n5 Z& G- J, {! e第一次接触cell数据是因为做一个数据处理时由于数据量太大excel的vlookup奔溃而数据库不熟练只能硬着头皮强行导入matlab匹配,其中有一列数据为年月日时分秒,还好matlab有cell数组,中间使用也遇到一些问题,现在总结一下用法方便以后复习和可能会用到的朋友。
* c( [# m1 e' T+ u3 x! k
) }" ^) L- [2 C  L9 vcell数组一般被叫做元胞数组,它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等,类似于学过的c语言里的结构体- F# v3 u* k$ ]. J

2 ]/ G1 b9 u! k% j% v' Y* \" `1.cell数组的创建! Z9 j* A7 P9 ~2 l
/ ^, S* M# s1 `9 m7 I8 K& [
可以直接通过{}类似于矩阵的直接赋值:a={'winter',123,'coming','哈哈'};
9 c3 x+ T/ W, _+ ?5 a8 u" o
/ T8 b0 ]/ q- x' @2 \* {) C也可以通过cell函数预分配内存,再赋值:a=cell(1,4);a={'winter',123,'coming','哈哈'};
7 z. u$ U- S6 f% O9 Z0 y" j; E3 }7 J' b) W2 L8 E
2.cell数组的访问
8 a' [  D3 h+ ^; Q2 b( d7 O: n
' b/ Q6 H% N2 y1 i* @7 _与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容,举例如下图所示,其他操作基本一样。
) j3 J6 ~3 _; Z0 W1 h3 W" m8 l% m: D5 f# i" }# ~2 V; h% C

5 D4 D$ S  _" s0 }7 c3.cell数组相关的函数/ d! B" z1 ~: Q- R: L' I

4 o" d) x4 N0 ]' hcell:创建空的元胞数组,预分配内存4 D* k8 B- O0 R. n

8 I. ^" m. d8 p( B. Z$ L9 Pcelldisp:显示元胞数组所有内容; L  T( K6 M/ n* [2 h; P) k

5 x# X$ |6 N3 O9 j& U5 g% ]8 {0 Tcellplot:利用图形方式显示内容
5 p* y  v$ S$ z% G2 H/ \6 ^& i3 x4 g: @; e

0 }* ]  C1 O% R1 u: |cell2mat:将元胞数组成普通矩阵(要求cell元胞数组的所有内容都必须为相同数据类型,可以为字符,会转化为字符矩阵)6 i; x7 N3 A4 Y) O+ e9 t, w

$ W% h% z" s" ~+ L6 h# Ymat2cell:将普通矩阵转化成元胞数组
/ y- ~2 C. Z( Y5 Z7 U/ k& A  |7 Z+ d
0 N2 w4 v$ k% y3 V+ riscell:判断输入是否为元胞数组: \6 G, I! v$ W1 A

% j; J% m7 f( dcellfun:为cell数组的每个cell单元的内容执行指定的函数,fun可以是特殊的函数或者句柄
: n: \+ W9 E+ s# [, m3 K6 A6 p/ T
, h/ m4 e7 Y( S. _A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。(官网解释)# B6 l3 x$ p" R% [
  j, t7 B1 G" H
默认情况下,cellfun 将 func 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。8 A' V7 e* {$ t6 B* c( Q
+ J" V( T  k/ h; R! D+ b  Z6 g
支持通过对象数组的线性索引进行赋值
6 B) J/ {# ^# x  A" L. ^! f
3 K" G& i' V- N- ]' s具有一个 reshape 方法,可返回与输入大小相同的数组
; [7 O! e& ?5 _0 M9 i$ T
+ \. d- E3 s* ^: a- A1 v如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 cellfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。/ T3 f( b3 ]& H, r1 V

8 u) p6 i5 u+ W. c8 T+ H8 I
% p/ ~/ q" C9 ^; {* g2 Yb={[1,2,1];[2,1,1];[1,1,2]};
% T: ^: t' @% ]2 ^1 ~1 C
& v4 T8 G9 v: p% x0 Z$ `; Q2 Rc=cellfun(@(x)(mat2str(x)),b,'un',0). A) {, y' N5 N: o/ H* e, M. m9 H

% S8 Y  Z4 E0 l

5 T2 J' f5 Z. x: s8 h8 J) a( e* d$ j! x, z* e: ]
: i6 w3 ?$ e4 ~8 W0 B+ j

' `% V; P' v+ 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
; t3 a3 R. m6 h. {7 Z1 u# |( ~, T- e" G4 K% [: Z+ b
4.cell单元的删除
! i- T+ y9 Y9 F' ^/ Y. Z0 W0 f- ^. n) h) o
我们知道矩阵及矩阵的删除可以通过[]实现:
  l2 `) L& z. ~' p
8 H- v  l: ?9 J- s4 j! S/ G7 h# p7 }

4 R/ O: A; I$ b$ ~元胞数组操作类似但和其赋值一样有区别,区别就在于{}和()
& ?! F' T: ?( ?! V$ L7 {1 Z+ Q5 C7 j. j- H$ z1 T, H, Z
a={1,2,3};
7 R" U+ a% }) x
+ b- {' u. j& F! e9 @7 w" L2 Za{1}=[];%并不能删除第一个cell单元,只是变成空值/ N8 @2 v, v" u( N# K& S
# x8 U+ {( n! ~
a(1)=[];%删除第一个单元% z( p2 b' n5 H5 F8 C- n, A3 d# Y
' S: u+ o, \+ I1 _, u; K5 f  s
+ W7 E' {0 t7 L1 L6 d! L
a()=[];%一次性删除所有cell单元
+ T& Y: C9 `7 \' l$ E4 H* f3 U. ^3 J# U+ P' \
0 {6 |" Z; t% b( I% D9 S: H

作者: damengshu    时间: 2021-9-18 11:01
cell数组类似于学过的c语言里的结构体
作者: jspij1    时间: 2021-9-18 13:40
cell与普通矩阵,数组的主要区别在于:通过()访问cell数组时访问到的是cell单元,通过{}访问cell数组时访问到的是cell单元储存的内容
作者: ldezgr    时间: 2021-9-25 20:44
LZ辛苦,学习学习




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2