matlab中结构体使用方法

article/2025/9/17 21:36:40
转自 http://hi.baidu.com/dess2211/blog/item/bb9b80185a7f940334fa417c.html

matlab中使用结构体
2008-01-15 14:23
结构(struct)数组

要在MALTAB中实现比较复杂的编程,就不能不用struct类型。而且在 MATLAB中实现struct比C中更为方便。

4. 3.1 结构数组的创建
MATLAB提供了两种定义结构的方式:直接应用和使用struct函数。
1. 使用直接引用方式定义结构
与建立数值型数组一样,建立新struct对象不需要事先申明,可以直接引用,而且可以动态扩充。比如建立一个复数变量x:
x.real = 0; % 创建字段名为real,并为该字段赋值为0
x.imag = 0 % 为x创建一个新的字段imag,并为该字段赋值为0 
x = 
real: 0
imag: 0 
然后可以将旗动态扩充为数组:
x(2).real = 0; % 将x扩充为1×2的结构数组
x(2).imag = 0; 
在任何需要的时候,也可以为数组动态扩充字段,如增加字段scale:
x(1).scale = 0; 
这样,所有x都增加了一个scale字段,而x(1)之外的其他变量的scale字段为空:
x(1) % 查看结构数组的第一个元素的各个字段的内容 
ans = 
real: 0
imag: 0
scale: 0 
x(2) % 查看结构数组的第二个元素的各个字段的内容,注意没有赋值的字段为空
ans = 
real: 0
imag: 0
scale: [] 
应该注意的是,x的real、imag、scale字段不一定是单个数据元素,它们可以是任意数据类型,可以是向量、数组、矩阵甚至是其他结构变量或元胞数组,而且不同字段之间其数据类型不需要相同。例如:
clear x; x.real = [1 2 3 4 5]; x.imag = ones(10,10); 

数组中不同元素的同一字段的数据类型也不要求一样:
x(2).real = '123';
x(2).imag = rand(5,1); 
甚至还可以通过引用数组字段来定义结构数据类型的某字段:
x(3).real = x(1); x(3).imag = 3; x(3) 
ans = 
real: [1x1 struct]
imag: 3 
下面看一个实际的例子来熟悉直接引用方式定义与显示结构。
【例4.3.1-1】 温室数据(包括温室名、容量、温度、湿度等)的创建与显示。
(1) 直接对域赋值法产生结构变量  
green_house.name = '一号温室'; % 创建温室名字段 
green_house.volume = '2000立方米'; % 创建温室容量字段
green_house.parameter.temperature = [31.2 30.4 31.6 28.7 % 创建温室温度字段
29.7 31.1 30.9 29.6];
green_house.parameter.humidity = [62.1 59.5 57.7 61.5; % 创建温室湿度字段
62.0 61.9 59.2 57.5]; 
(2)显示结构变量的内容
green_house % 显示结构变量结构 
green_house = 
name: '一号温室'
volume: '2000立方米'
parameter: [1x1 struct] 
green_house.parameter % 用域作用符号. 显示指定域(parameter)中内容 
ans = 
temperature: [2x4 double]
humidity: [2x4 double] 
green_house.parameter.temperature % 显示temperature域中的内容 
ans =
31.2000 30.4000 31.6000 28.7000
29.7000 31.1000 30.9000 29.6000 

【例4.3.1-2】在上例的基础上,创建结构数组用以保存一个温室群的数据。
green_house(2,3).name = '六号温室'; %产生2×3结构数组
green_house % 显示结构数组的结构 
green_house = 
2x3 struct array with fields:
name
volume
parameter 
green_house(2,3) % 显示结构数组元素的结构 
ans = 
name: '六号温室'
volume: []
parameter: [] 

2. 使用struct函数创建结构
使用struct函数也可以创建结构,该函数产生或吧其他形式的数据转换为结构数组。
struct的使用格式为:
s = sturct('field1',values1,'field2',values2,…);
该函数将生成一个具有指定字段名和相应数据的结构数组,其包含的数据values1、valuese2等必须为具有相同维数的数据,数据的存放位置域其他结构位置一一对应的。对于struct的赋值用到了元胞数组。数组values1、values2等可以是元胞数组、标量元胞单元或者单个数值。每个values的数据被赋值给相应的field字段。
当valuesx为元胞数组的时候,生成的结构数组的维数与元胞数组的维数相同。而在数据中不包含元胞的时候,得到的结构数组的维数是1×1的。例如:
s = struct('type',{'big','little'},'color',{'blue','red'},'x',{3,4}) 
s = 
1x2 struct array with fields:
type
color

得到维数为1×2的结构数组s,包含了type、color和x共3个字段。这是因为在struct函数中{'big','little'}、{'blue','red'}和{3,4}都是1×2的元胞数组,可以看到两个数据成分分别为:
s(1,1) 
ans = 
type: 'big'
color: 'blue'
x: 3 
   s(1,2) 
ans = 
type: 'little'
color: 'red'
x: 4 
相应的,如果将struct函数写成下面的形式:
s = struct('type',{'big';'little'},'color',{'blue';'red'},'x',{3;4}) 
s = 
2x1 struct array with fields:
type
color

则会得到一个2×1的结构数组。
下面给出利用struct构建结构数组的具体实例。
【例4.3.1-3】利用函数struct,建立温室群的数据库。
(1) struct预建立空结构数组方法之一
a = cell(2,3); % 创建2×3的元胞数组
green_house_1=struct('name',a,'volume',a,'parameter',a(1,2))
green_house_1 = 
2x3 struct array with fields:
name
volume
parameter 
(2)struct预建空结构数组方法之二
green_house_2=struct('name',a,'volume',[],'parameter',[])     
green_house_2 = 
2x3 struct array with fields:
name
volume
parameter 
(3)struct预建空结构数组方法之三
green_hopuse_3(2,3)=struct('name',[],'volume',[],'parameter',[]) 
green_hopuse_3 = 
2x3 struct array with fields:
name
volume
parameter 
(4)struct创建结构数组方法之四
a1={'六号房'};a2={'3200立方米'};
green_house_4(2,3)=struct('name',a1,'volume',a2,'parameter',[]);
T6=[31.2,30.4,31.6,28.7;29.7,31.1,30.9,29.6];             green_house_4(2,3).parameter.temperature=T6;            
green_house_4 
ans = 
2x3 struct array with fields:
name
volume
parameter 

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: -

(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, Smile=[]                   % 收缩成为 的结构
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:

%显示结构数组的域中内容
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

http://chatgpt.dhexx.cn/article/oAXn0u2K.shtml

相关文章

Matlab中结构体struct创建和使用

在项目上遇见了调用api接口,接口返回的信息为struct,故探讨一下matlab的struct结构体 1、struct结构体创建 创建结构体数组有两种方式,分别为直接创建和使用struct函数 1.1 直接创建 直接定义字段,像使用一般matlab变量一样&…

matlab 结构体

在前面,有用到一个cell2struct()函数,cell是单元数组,而struct就是结构体。 1.建立结构体,在matlab中建立结构体有两种方式, eg:第一种为直接赋值 >> stu(1).namezhangsan; …

单片机实例4——广告灯的左移右移(硬件电路图+汇编程序+C语言程序)

4. 广告灯的左移右移 1. 实验任务 做单一灯的左移右移,硬件电路如图4.4.1所示,八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P…

蓝桥杯-左移右移(2022国赛)

蓝桥杯-左移右移 1、问题描述2、解题思路与代码实现2.1 方法一:使用LinkedList双向链表实现(50%)2.2 方法二:使用HashMap左右临界值实现(100%) 1、问题描述 小蓝有一个长度为 N 的数组, 初始时从左到右依次是 1,2,3,…N 。 之后小蓝对这个数组进行了 M 次…

第十三届蓝桥杯大赛软件类决赛Java大学B组C题——左移右移

【问题描述】 小蓝有一个长度为 N 的数组,初始时从左到右依次是 1, 2, 3, . . . N。 之后小蓝对这个数组进行了 M 次操作,每次操作可能是以下 2 种之一: 左移 x,即把 x 移动到最左边。右移 x,即把 x 移动到最右边。 …

算术逻辑左移右移

左移&#xff08;<<&#xff09;&#xff1a; 算术左移和逻辑左移的规则相同&#xff0c;都是整体左移&#xff0c;高位舍去&#xff0c;低位补零。 而且我们知道在计算机内部中的数都是用补码来进行存储的&#xff0c;这样便可以把减法运算也转化为加法运算。 1110的原码…

位运算符之左移右移(简单易懂)

前言: 位运算符是用来对二进制位进行操作的 c语言中有6种位运算符: & 按位与 [链接]: https://blog.csdn.net/weixin_42837024/article/details/98736834 | 按位或 [链接]:https://blog.csdn.net/weixin_42837024/article/details/98745019 ^ 按位异或 [链接]:https://blog…

关于左移右移的一些问题,左移右移之后应该应该赋值给原变量

关于左移右移的一些问题&#xff0c;左移右移之后应该应该赋值给原变量 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。…

蓝桥杯第十三届决赛真题-左移右移

左移右移 一、思路分析二、数组模拟双链表❗️❗️三、代码展示 题目链接 问题描述 小蓝有一个长度为 N 的数组, 初始时从左到右依次是 1,2,3, …N 。 之后小蓝对这个数组进行了 M 次操作, 每次操作可能是以下 2 种之一: 左移 x, 即把 x 移动到最左边。 右移 x, 即把 x 移动到…

C语言左移右移操作符详解

看到过很多C语言中的移位操作相关的博文&#xff0c;但是这些博文之间的深度实在是差别太大了&#xff0c;对于初学者来说&#xff0c;想要弄明白移位操作并不容易&#xff0c;有的博文仅仅是讲了怎么进行位移&#xff0c;初学者可能会因此写下bug&#xff0c;有的博文虽然到位…

彻底理解位运算——左移、右移

相信大家在各种语言各种框架中都能看到二进制的操作。左移、右移、&、|、^等等操作。那么这篇帖子让各位彻底弄懂左移、右移。 首先先区分那个是左移、那个是右移&#xff0c;这很简单&#xff0c;从箭头指向的方向来区分。<<左移&#xff0c;>>右移 左移&am…

汉诺塔

2019独角兽企业重金招聘Python工程师标准>>> 伪算法&#xff1a; 如果是1个盘子 直接将A柱子上的盘子从A移到C 否则 先将A柱子上的n-1个盘子借助C移到B <?php function hannuota($n,$a,$b,$c){if ($n1) {echo 盘子 .$n. 直接从柱子 .$a. 移动到柱子 .$c.<br/…

汉诺塔Java递归实现

2019独角兽企业重金招聘Python工程师标准>>> 算法逻辑&#xff1a; 利用递归&#xff0c;当n为1时为递归出口&#xff0c;通过改变柱子的位置实现 当只有一个盘子时是从a&#xff08;初始&#xff09;->c&#xff08;目的&#xff09; 当有n个盘子时 先 &#x…

汉诺塔------java算法

这其实是一个递归问题&#xff0c;下面是用Java对汉诺塔的实现。 源代码&#xff1a; 方式一&#xff1a; import java.util.Scanner;/***BelongsProject: javaSenior*BelongsPackage: PACKAGE_NAME*Author: 48-zj*CreateTime: 2023-04-13 22:09*Description: TODO*Version:…

数据结构与算法之递归

直接或间接地调用自身的算法称为递归算法。 通过这种递推关系把原来问题缩小成一个更小规模的同类问题&#xff0c;并延续这一缩小规模的过程&#xff0c;直到在某一规模上&#xff0c;问题的解是已知的。这样一种解决问题的思想我们称为递归的思想。 常见题目1&#xff1a; …

递归详解-斐波那契、汉诺塔、青蛙跳台阶、字符串长度

递归-斐波那契数列 这里我们讲解一下 斐波那契数列的经典递归问题。 斐波那契数列&#xff1a; 1 1 2 3 5 8 13 21 34… 从第三个数字开始&#xff0c;下一个数字等于前面两个数字之后&#xff0c;有点像我们数学的数列 n(x-1)n(x-2) 那如果我们要求第n个数字&#xff0c;应该…

HDU - 1995 汉诺塔V 难度:递归入门 复杂度:有点复杂

方案一&#xff08;公式法&#xff09; 我还不清楚用递归来解汉诺塔问题是怎么解&#xff0c;对递归比较陌生&#xff0c;但后来发现这题可以不用递归&#xff0c;套用下面发现的公式即可。 一个盘 1号1次 两个盘 1号2次 2号1次 三个盘 1号4次 2号2次 3号1次 四个盘…

【Python学习】Python解决汉诺塔问题

摘要&#xff1a; 参考文章&#xff1a;http://www.cnblogs.com/dmego/p/5965835.html 一句话&#xff1a;学程序不是目的&#xff0c;理解就好&#xff1b;写代码也不是必然&#xff0c;省事最好&#xff1b;拿也好&#xff0c;查也好&#xff0c;解决问题就好&#xff01; 信…

C++ 汉诺塔程序实现

2019独角兽企业重金招聘Python工程师标准>>> 首先不看代码&#xff0c;汉诺塔解题步骤有三步&#xff08;设A->C&#xff09;&#xff0c;先将汉诺塔看成两部分n-1,1(n-1在上面) 第一&#xff1a;将A中的n-1个盘借助C移到B >Hanoi(n-1,a,c,b); 第二&#xff…

【算法与数据结构】汉诺塔

数据结构里的汉诺塔&#xff0c;递归的典型代表&#xff0c;几乎讲到递归都会讲到汉诺塔&#xff0c;今天才把汉诺塔看明白&#xff0c;惭愧啊。 不废话了&#xff0c;贴代码&#xff0c;基本思想在注释里有&#xff0c;话说往CNBLOG首页投了两次&#xff0c;两次都被小编给扯下…