4. 3.2 结构数组的操作

MATLAB中专门用于对结构数组的操作的函数并不多,通过 help datatypes获取数据类型列表,可以看到其中的结构数据类型的有关的函数,主要如表4.3.1所示。

表4.3.1 结构数组的操作函数

函数名   功能描述   函数名   功能描述

deal   把输入处理成输出   fieldnames   获取结构的字段名

getfield   获取结构中指定字段的值   rmfield   删除结构的字段(不是字段内容)

setfield   设置结构数组中指定的字段的值   struct   创建结构数组

struct2cell   结构数组转化成元胞数组   isfield   判断是否存在该字段

isstruct   判断某变量是否是结构类型

下面举一些具体的例子说明如果对结构数组加以操作。

【例4.3.2-1】 本例目的:一,演示函数fieldnames , getfield , setfield的使用方法;二,让读者感受到结构数组对应用工具包的影响;三,演示struct函数把“对象”转换为结构的应用。本例为获得一个演练的结构,借助Toolbox control 工具包中的tf函数,先产生一个用传递函数描写的LTI线性时不变2输入2输出系统 。

(1)产生2输入2输出系统的传递函数阵“对象”

Stf=tf({3,2;[4 1],1},{[1 3 2],[1 1 1];[1 2 2 1],[1 0]})

Transfer function from input 1 to output...

3

#1: -------------

s^2 + 3 s + 2

4 s + 1

#2: ---------------------

s^3 + 2 s^2 + 2 s + 1

Transfer function from input 2 to output...

2

#1: -----------

s^2 + s + 1

1

#2: -

s

(2)为本例演示,把上述的LTI对象Stf转换为结构

SSTF=struct(Stf)       % 把对象转换成结构,并显示结构的组成

SSTF =

num: {2x2 cell}

den: {2x2 cell}

Variable: 's'

lti: [1x1 lti]

(3)获得结构数组SSTF的域名

FN=fieldnames(SSTF) % 获得域名元胞数组FN

class(FN)     % 检查FN的类别

FN =

'num'

'den'

'Variable'

'lti'

ans =

cell

(4)获取SSTF.den(2,1)域的内容

FC=getfield(SSTF,'den',{2,1})     % 相当于FC=SSFT.den(2,1)

FC{1}                   % 与celldisp(FC)的作用大致相当

poly2str(FC{1},'s'),         % 为了把多项式显示成习惯的形式

FC =

[1x4 double]

ans =

1 2 2 1

ans =

s^3 + 2 s^2 + 2 s + 1

(5)重新设置SSTF.num(2,1)域的内容

SSTF.num{2,1}                 % 显示原始情况

SSTF=setfield(SSTF,'num',{2,1},{[1 3 1]}); %   注意“花括号”的使用

SSTF.num{2,1}                     % 显示被重新设置后的情况

ans =

0 0 4 1

ans =

1 3 1

【例4.3.2-2】本例演示结构数组SSTF的扩充和收缩。(本例以例4.3.2-1的运行为基础。)

(1)原结构是一个“单结构”

size(SSTF)

ans =

1 1

(2)演示结构的扩充

SSTF(2,2)=struct(tf(1,[1 1]))     % 把1/(s+1)放在第2行第2列结构中

size(SSTF)

SSTF =

2x2 struct array with fields:

num

den

Variable

lti

ans =

2 2

(3)演示结构数组的收缩:删除结构数组的第1行

SSTF(1,

=[]                   % 收缩成为 的结构

S22n=SSTF(1,2).num,S22d=SSTF(1,2).den   % 取出第2结构num域和den域的内容

printsys(S22n{1},S22d{1})           % 显示成习惯的表达形式

SSTF =

1x2 struct array with fields:

num

den

Variable

lti

S22n =

[1x2 double]

S22d =

[1x2 double]

num/den =

1

-----

s + 1

【例4.3.2-3】对结构数组进行域的增添和删减操作。

(1)创建结构数组

clear,for k=1:10;department(k).number=['No.',int2str(k)];end

department

department =

1x10 struct array with fields:

number

(2)增添域:在数组中任何一个结构上进行的域增添操作,其影响遍及整个结构数组

department(1).teacher=40;department(1).student=300;

department(1).PC_computer=40;

department

department =

1x10 struct array with fields:

number

teacher

student

PC_computer

(3)增添子域的操作只影响被操作的那个具体结构,而不是影响整个结构数组

department(2).teacher.male=35;department(2).teacher.female=13;

D2T=department(2).teacher     % 第2结构teacher域包含两个子域

D1T=department(1).teacher     % 第1结构teacher域仅是一个数

D2T =

male: 35

female: 13

D1T =

40

(4)删除子域的操作也只影响被操作的那个具体结构

department(2).teacher=rmfield(department(2).teacher,'male');

department(2).teacher

ans =

female: 13

(5)删除域的操作是对整个结构数组实施的

department=rmfield(department,'student')   % 删除一个域

department =

1x10 struct array with fields:

number

teacher

PC_computer

department=rmfield(department,{'teacher';'PC_computer'})% 删除2个域

department =

1x10 struct array with fields:

number

【例4.3.2-4】数值运算操作和函数在结构域上的作用。

n_ex = 5; % 结构数组的长度

for k = 1:n_ex,   % 创建1×5结构数组

ex(k).f = (k-1)*n_ex + [1:5];

end;

ex                           % 显示结构数组的结构

ex =

1x5 struct array with fields:

f

%显示结构数组的域中内容

disp([blanks(10) '结构域中内容'])

for k=1:n_ex,disp(ex(k).f),end

结构域中内容

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

21 22 23 24 25

class(ex(1).f)                   % 检查域中内容的类型

ans =

double

% 对各结构域中数值数组相应位置的数据相加求和

sum_f=zeros(1,5)

for k=1:n_ex,sum_f=sum_f+ex(k).f;end,sum_f

sum_f =

55 60 65 70 75

% 对结构数组域中各元素分别求平方根

disp([blanks(20) 'ex.f的平方根值'])

for k=1:n_ex,

disp(sqrt(ex(k).f)),

end

ex.f的平方根值

1.0000 1.4142 1.7321 2.0000 2.2361

2.4495 2.6458 2.8284 3.0000 3.1623

3.3166 3.4641 3.6056 3.7417 3.8730

4.0000 4.1231 4.2426 4.3589 4.4721

4.5826 4.6904 4.7958 4.8990 5.0000

【例4.3.2-5】   指令struct2cell和cell2struct的使用。

(1)创建“带2个域的 结构数组”

for k=1:5,

ex(k).s=['No.' int2str(k)];

ex(k).f=(k-1)*5+[1:5];

end

(2)显示结构数组的内容

fprintf('%s\n','ex.s域的内容 ');fprintf('%s\',blanks(4))

for k=1:5;fprintf('%s\\',[ex(k).s blanks(1)]);end

fprintf('%s\n',blanks(1)),fprintf('%s\n','ex.f域的内容 ')

for k=1:5;disp(ex(k).f);end     %显示ex.f域内容

ex.s域的内容

No.1 \No.2 \No.3 \No.4 \No.5 \

ex.f域的内容

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

21 22 23 24 25

(3)把ex结构数组转换为元胞数组

C_ex=struct2cell(ex); % 带2个域的(1×5)结构数组转换为(2×1×5)元胞数组

size(C_ex)

fprintf('%s\',[C_ex{1,1,1},blanks(3)])   % 显示C_ex第1页第1行第1列内容

fprintf('%5g\',C_ex{2,1,1})         % 显示C_ex第2页第1行第1列内容

ans =

2 1 5

No.1 1 2 3 4 5

(4)把元胞数组转换为结构数组之一

FS={'S_char';'F_num'};        % 用元胞数组预建域名字符串

EX1=cell2struct(C_ex,FS,1)      % 元胞数组向结构数组转换

EX1 =

1x5 struct array with fields:

S_char

F_numric

EX1(1)                   % 观察新结构EX1第一结构的情况

ans =

S_char: 'No.1'

F_numric: [1 2 3 4 5]

(5)把元胞数组转换为结构数组之二

EX2=cell2struct(C_ex,'xx',2)

EX2 =

2x5 struct array with fields:

xx

(6)把元胞数组转换为结构数组之三

YY=strvcat('y1','y2','y3','y4','y5');EX3=cell2struct(C_ex,YY,3)

EX3 =

2x1 struct array with fields:

y1

y2

y3

y4

y5

EX3(1)                   % 观察第一结构情况

ans =

y1: 'No.1'

y2: 'No.2'

y3: 'No.3'

y4: 'No.4'

y5: 'No.5'

EX3(2)                   % 观察第二结构情况

ans =

y1: [1 2 3 4 5]

y2: [6 7 8 9 10]

y3: [11 12 13 14 15]

y4: [16 17 18 19 20]

y5: [21 22 23 24 25]

【例4.3.2-6】   带子域的结构数组转换为元胞数组。本例中的ex结构数组由例4.2.2-5生成,然后再运行以下程序。

ex(1,1).s                 % 原结构ex(1,1).s中的内容

ans =

No.1

% 增设子域,并把ex结构数组扩充为(3×5)。

ex(1,1).s.sub='SUB 1';         % 原ex(1,1).s中的字符串将因本指令而消失

ex(3,1).s.sub='SUB 3';

ex(3,1).s.num=1/3;

ex(1,1).s                 % 经新赋值后,ex(1,1).s中的内容

ans =

sub: 'SUB 1'

ex(3,1).s                 % 经新赋值后,ex(3,1).s中的内容

ans =

sub: 'SUB 3'

num: 0.3333

C_ex_sub=struct2cell(ex)       % 把结构转换为元胞数组

C_ex_sub(:,:,1) =

[1x1 struct] [] [1x1 struct]

[1x5 double] [] []

C_ex_sub(:,:,2) =

'No.2' [] []

[1x5 double] [] []

C_ex_sub(:,:,3) =

'No.3' [] []

[1x5 double] [] []

C_ex_sub(:,:,4) =

'No.4' [] []

[1x5 double] [] []

C_ex_sub(:,:,5) =

'No.5' [] []

[1x5 double] [] []

size(C_ex_sub)             % 观察新元胞数组的大小

ans =

2 3 5

C_ex_sub{1,1,1}             % 观察第一元胞中的内容

ans =

sub: 'SUB 1'

C_ex_sub{1,3,1}             % 观察(1,3,1)元胞中的内容

ans =

sub: 'SUB 3'

num: 0.3333

matlab 结构(struct)数组,matlab 结构(struct)数组相关推荐

  1. Matlab 结构体数组 基础知识 struct(自学文档)

    struct 结构体数组 全页展开 说明 结构体数组是使用名为字段的数据容器将相关数据组合在一起的数据类型.每个字段都可以包含任意类型的数据.可以使用 structName.fieldName 格式的 ...

  2. matlab单元数组和结构,Matlab使用单元数组和结构数组

    Matlab使用字符串数组.单元数组(cell array)和结构数组 (struct array) 要在MALTAB中实现比较复杂的编程,就不能不用单元数组(cell array)和结构数组(str ...

  3. matlab单元数组和结构,Matlab中单元数组和结构数组

    前言: 单元数组和结构数组是一种新的数据类型,能将不同类型.不同维数的数组组合在一起,从而方便对不同的数据类型方便管理和维护. 如上图所示的2*2矩阵中,分别存储着四种不同的数据类型,分别为数组.字符 ...

  4. 【Matlab】系统预定义变量——元胞数组与结构体

    [Matlab]系统预定义变量--元胞数组与结构体 往期回顾 前言 正文 一.元胞数组 1. 元胞数组操作函数 2. 代码实例 二.结构体 1. 结构体操作函数 2. 代码实例 总结 参考文献 往期回 ...

  5. MATLAB元胞数组与结构体

    元胞数组与结构体 元胞数组 元胞数组的创建 元胞数组的引用(访问) 结构体 结构体的创建 结构体的引用(访问) 结构体的例子 结构体数组 元胞数组 元胞数组就是一种特殊的数据类型,组成元胞数组的元素可 ...

  6. matlab 结构体 单元数组,matlab结构体、数组和单元数组类型的创建

    matlab结构体.数组和单元数组类型的创建 @ matlab结构体类型 通过字段赋值创建结构体 创建格式: 结构体名称.字段名称 样例: >> student.name='Alan'; ...

  7. matlab 不同函数间传递结构体数据_matlab 结构体struct函数使用方法

    1.struct函数直接定义 查阅文档是这样的:struct(field1,value1,field2,value2,.....) 上面这个格式很重要记住 field1和field2称为这个结构体的字 ...

  8. 2018.9.15,Matlab实验三:字符串、单元数组和结构体

    一.实验任务和目的 掌握Matlab的字符串常用函数及其操作方法. 掌握Matlab的结构体的基本操作方法. 掌握Matlab的元胞数组的基本操作方法. 二.实验内容 字符串数组Str=['hopes ...

  9. c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const

    十二.结构体 (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型. 参考视频:https://www.bilibili.com/video/BV1et411b ...

最新文章

  1. LeetCode35.搜索插入位置
  2. 树莓派AI视觉云台——1.树莓派Pi3简介
  3. android客户端在多个界面切换时保持socket的链接的实例
  4. 剥开浮躁表面,直指金融科技内心
  5. 数据库周刊第十七期来啦!
  6. pcjome新闻图片替换效果
  7. python中自定义类中的self_学习python第52天
  8. linux用户一个用户只能一个用户组,为什么linux用户可以属于多个用户组,文件只能属于一个用户组?...
  9. linux卸载intel驱动程序,Linux的英特尔图形驱动程序调试工具删除Android支持
  10. 二阶行列式求救二元线性方程组
  11. 什么是组态?组态的概念及发展趋势
  12. 网卡 promiscuous mode 与 MAC 的一些 filter 功能
  13. linux中无法联网小电脑图标不见,电脑桌面上的网络连接图标突然不见怎么解决?...
  14. 用链接法实现散列表构造和查找
  15. Using GDB To Trace Into a Parallel Worker Spawned By Postmaster During a Large Query
  16. 什么是Hypervisor
  17. 关于新冠疫情,常用的英文单词、语句有哪些?
  18. vgg19.npy下载
  19. 我还能走很远---lua和tolua++
  20. SpreadJS 16.0.1 中英版 SpreadJS-EN-CN

热门文章

  1. 暑假周进度总结报告5
  2. Linux文件类型详解
  3. Ubuntu 下 Eclipse 桌面图标创建
  4. ActiveMQ的消息的(含附件)发送和接收使用
  5. 输入姓名打印年龄练习
  6. 代码编译方式 ant +ivy
  7. div 显示滚动条的CSS代码
  8. javascript模态窗口Demo
  9. 互利网上数字金融典型场景: 网络营销
  10. Ubuntu14.04server 安装 fping