
如果要在MALTAB中实现更复杂的编程,则不能使用结构类型. 并且在Matlab中实现结构比在C中实现更方便.
4. 3.1创建结构数组
Matlab提供了两种定义结构的方法: 直接应用和使用struct函数.
1. 使用直接引用来定义结构
就像创建数字数组,创建新的struct对象一样,不需要事先声明,可以直接引用它,并且可以动态扩展它. 例如,创建一个复杂变量x:
x.real = 0;%创建一个名为real的字段,并将0分配给该字段
x.imag = 0%为x创建一个新的字段imag,并将0分配给该字段
x =
真实: 0
imag: 0
然后可以将其动态扩展为数组:
x(2).real = 0;%将x扩展为1×2结构数组
x(2).imag = 0;
在必要时,您还可以动态扩展数组的字段,例如增加字段比例:
x(1).scale = 0;
这样,所有x都添加了一个scale字段,而除x(1)以外的其他变量的scale字段为空:
x(1)%查看结构数组第一个元素的每个字段的内容
ans =
真实: 0
imag: 0
比例: 0
x(2)%查看结构数组第二个元素的每个字段的内容,请注意未分配的字段为空
ans =
真实: 0
imag: 0
规模: []
应注意,x的实数字段,图像字段和标度字段不一定是单个数据元素,它们可以是任何数据类型,并且可以是向量,数组,矩阵,甚至其他结构变量或单元格数组,以及不同的字段数据类型不必相同. 例如:
清除x; x.real = [1 2 3 4 5]; x.imag =个(10,10);
数组中不同元素的相同字段的数据类型不必相同:
x(2).real ='123';
x(2).imag = rand(5,1);
您甚至可以通过引用数组字段来定义结构数据类型的字段:
x(3).real = x(1); x(3).imag = 3; x(3)
ans =
真实: [1x1结构]
imag: 3
看一个实际的例子,以熟悉直接引用的定义和显示结构.
【示例4.3.1-1】温室数据的创建和显示(包括温室名称,容量,温度,湿度等).
(1)直接为域分配方法生成结构变量
green_house.name ='否. 1个温室';%创建一个温室名称字段
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. 湿度= [62.1 59.5 57.7 61.5; %创建温室湿度场
62.0 61.9 59.2 57.5];
(2)显示结构变量的内容
green_house%显示结构变量结构
green_house =
名称: '否. 1个温室”
体积: “ 2000立方米”
参数: [1x1结构]
green_house.parameter%使用字段功能符号. 在指定的字段(参数)中显示内容
ans =
温度: [2x4倍]
湿度: [2x4倍]
green_house.parameter.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结构数组:
名称
音量
参数
green_house(2,3)%显示结构数组元素的结构
ans =
名称: “第六温室”
音量: []
参数: []
2. 使用struct函数创建结构
您还可以使用struct函数创建结构. 此函数将其他形式的数据生成或转换为结构数组.
struct的格式为:
s = sturct('field1',values1,'field2',values2,...);
此函数将生成具有指定字段名称和相应数据的结构数组. 其中包含的数据value1,value2等必须是维数相同的数据,并且数据存储位置字段与其他结构位置一一对应. 单元格数组用于分配struct. 数组values1,values2等可以是单元格数组,标量单元格单位或单个值. 每个值的数据都分配给相应的字段字段.
当valuesx是单元格数组时,生成的结构数组的尺寸与单元格数组的尺寸相同. 当单元不包括在数据中时,所得结构数组的尺寸为1×1. 例如:
s = struct('type',{'big','little'},'color',{'blue','red'},'x',{3,4})
s =
具有字段的1x2结构数组:
类型
颜色
x

获取尺寸为1×2的结构数组s,其中包含3个类型,颜色和x字段. 这是因为{'big','little'},{'blue','red'}和{3,4}在struct函数中都是1×2单元格数组,您可以看到这两个数据分量是对于:
s(1,1)
ans =
类型: “大”
颜色: “蓝色”
x: 3
s(1,2)
ans =
类型: “小”
颜色: “红色”
x: 4
相应地,如果struct函数以以下形式编写:
s = struct('type',{'big';'little'},'color',{'blue';'red'},'x',{3; 4})
s =
具有字段的2x1结构数组:
类型
颜色
x
您将获得2×1结构数组.
以下是使用struct构造结构数组的具体示例.
【例4.3.1-3】使用函数struct建立温室群.
(1)结构预构建空结构数组的方法之一
a = cell(2,3);%创建2×3单元格数组
green_house_1 = struct('name',a结构体,'volume',a,'parameter',a(1,2))
green_house_1 =
具有字段的2x3结构数组:
名称
音量
参数
(2)结构预构建空结构数组的第二种方法
green_house_2 = struct('name',a,'volume',[],'parameter',[])
green_house_2 =
具有字段的2x3结构数组:
名称
音量
参数
(3)结构预建空结构数组的第三种方法
green_hopuse_3(2,3)= struct('name',[],'volume',[],'parameter',[])
green_hopuse_3 =
具有字段的2x3结构数组:
名称
音量
参数
(4)结构的第四种创建结构数组的方法
a1 = {'Room 6'}; 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结构数组:
名称
音量
参数
4. 3.2结构数组的操作
MATLAB中没有很多函数专用于结构数组的操作. 您可以通过帮助数据类型获取数据类型列表. 您可以看到结构数据类型的相关功能,主要显示在表4.3.1中.
表4.3.1结构数组的运算功能
功能名称功能说明功能名称功能说明
deal将输入处理为输出字段名,以获取结构的字段名
getfield获取结构rmfield中指定字段的值,删除结构的字段(不是字段内容)
setfield设置在结构数组struct中指定的字段的值,创建一个结构数组
将struct2cell结构数组转换为单元格数组isfield以确定该字段是否存在
isstruct确定变量是否为结构类型
以下是一些具体示例,以说明如何对结构数组进行操作.
[示例4.3.2-1]该示例的目的: 首先,演示函数fieldnames,getfield,setfield的用法;其次,让读者感受到结构数组对应用程序工具包的影响;第三,演示将“对象”的结构函数转换为结构化应用程序的示例在此示例中,为了获得钻取结构,借助Toolboxcontrol工具箱中的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]})
将功能从输入1传输到输出...
3
#1: -------------
s ^ 2 + 3 s + 2
4 s + 1
#2: ---------------------
s ^ 3 + 2 s ^ 2 + 2 s + 1
将功能从输入2传输到输出...
2
#1: -----------
s ^ 2 + s + 1
1
#2: -
s
(2)此示例说明了上述LTI对象Stf已转换为结构
SSTF = struct(Stf)%将对象转换为结构并显示结构的组成
SSTF =
num: {2x2单元格}

den: {2x2单元格}
变量: 's
lti: [1x1 lti]
(3)获取结构数组SSTF的域名
FN = fieldnames(SSTF)%获得域名的单元格FN
class(FN)%检查FN的类别
FN =
'num'
'den'
“变量”
'lti'
ans =
单元格
(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双]
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)原始结构是“单一结构”
大小(SSTF)
ans =
1 1
(2)扩展表示结构
SSTF(2,2)= struct(tf(1,[11]))%将1 /(s + 1)放入第2行第2列的结构中
大小(SSTF)
SSTF =
具有字段的2x2结构数组:
num
den
变量
lti
ans =
2 2
(3)结构数组收缩的演示: 删除结构数组的第一行
SSTF(1,
{a: 0: 7: 1: 5: 7: 8: d: c: a: 2: c: 0: 5: 2: 2: 7: 3: c: 4} = []%缩小至成为结构
S22n = SSTF(1,2).num,S22d = SSTF(1,2).den%提取第二个结构的num字段和den字段的内容
printsys(S22n {1},S22d {1})%显示为惯用表达式
SSTF =
具有字段的1x2结构数组:
num
den
变量
lti
S22n =
[1x2 double]
S22d =
[1x2 double]
num / den =
1
-----
s + 1
【示例4.3.2-3】向结构数组添加和删除字段.
(1)创建一个结构数组
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-252426-1.html
以乱放屁罪判处3年有期徒刑
12海里也允许正常航行