指点成金-最美分享吧

登录

matlab怎样输出结构体数组

佚名 举报

篇首语:本文由小编为大家整理,主要介绍了matlab怎样输出结构体数组相关的知识,希望对你有一定的参考价值。

结构(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
x
得到维数为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
x
则会得到一个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: -
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)
FC1 % 与celldisp(FC)的作用大致相当
poly2str(FC1,"s"), % 为了把多项式显示成习惯的形式
FC =
[1x4 double]
ans =
1 2 2 1
ans =
s^3 + 2 s^2 + 2 s + 1
(5)重新设置SSTF.num(2,1)域的内容
SSTF.num2,1 % 显示原始情况
SSTF=setfield(SSTF,"num",2,1,[1 3 1]); % 注意“花括号”的使用
SSTF.num2,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(S22n1,S22d1) % 显示成习惯的表达形式
SSTF =
1x2 struct array with fields:
num
den
Variable
lti
S22n =
[1x2 double]
S22d =
[1x2 double]
num/den =
1
-----
s + 1
参考技术A 不知道你要怎么输出,只是看一下的话,命令行输入数组名就行了

C语言结构体数组,结构体数组的定义,结构体数组的输出,结构体的应用

结构体数组

结构体数组的定义:

结构体数组格式:声明变量类型 数组名称[数组长度]

//定义一个结构体数组名为a,它里面包含有5个元素,每一个元素都是一个结构体变量Wor a[5]=;
#include typedef struct workerchar id[10];char name[10];char sex[10];int pay;WOR;void main()WOR a[3]="0001","陈文杰","男",1200,"0001","张三丰","女",500,"0001","张四丰","女",1200

对比记忆

结构体数组的输出

#include typedef struct workerchar id[10];char name[10];char sex[10];int pay;WOR;void main()WOR a[6]="0001","陈文杰","男",1200,"0002","张三丰","女",5000,"0003","张四丰","女",1200, "0004","张五丰","男",2200,"0005","张六丰","男",5200,"0006","张七丰","男",6200 ;int i;for(i=0;i<6;i++)printf("%s,%s,%s,%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);


结构体对象中的a[i]就代表一个对象,它已经不再是一个值了
所以我们应该用a[ii].成员名

改进以上程序

#include typedef struct workerchar id[10];char name[10];char sex[10];int pay;WOR;void output(WOR a[],int n)//次函数是用来输出长度为n的工人数组的信息 int i;printf("工号\t姓名\t性别\t年龄\n"); for(i=0;i<6;i++)printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);void main()WOR a[6]="0001","陈文杰","男",1200,"0002","张三丰","女",5000,"0003","张四丰","女",1200, "0004","张五丰","男",2200,"0005","张六丰","男",5200,"0006","张七丰","男",6200 ;output(a,6);

结构体的应用

案例一、

1、编写一个函数,它的目的是为了输出所有性别为男的的职工信息
算法分析:
1)这个函数它不用返回值因为该函数是为了完成输出
2)该函数要处理很多职工,就需要一个数组,数组的类型为职工类型
注意:在C语言当中字符串不能直接比较是否相同,要通过strcmp这个函数来比较其两个字符串是否相同

#include#include typedef struct workerchar id[10];char name[10];char sex[10];int pay;WOR;void QueryWorker(WOR a[],int n)//次函数是用来输出长度为n的工人数组的信息 int i;printf("全部员工:\n"); printf("工号\t姓名\t性别\t年龄\n"); for(i=0;i<6;i++)printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);printf("所有男员工:\n"); printf("工号\t姓名\t性别\t年龄\n"); for(i=0;i<6;i++)if(strcmp(a[i].sex,"男")==0) printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay); printf("所有女员工:\n"); printf("工号\t姓名\t性别\t年龄\n"); for(i=0;i<6;i++)if(strcmp(a[i].sex,"女")==0) printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay); void main()WOR a[6]= "0001","陈文杰","男",1200,"0002","张三丰","女",5000,"0003","张四丰","女",1200, "0004","张五丰","男",2200,"0005","张六丰","男",5200,"0006","张七丰","男",6200 ;QueryWorker(a,6);


2、能够输出指定性别的职工

#include typedef struct workerchar id[10];char name[10];char sex[10];int pay;WOR;void QueryBySex(WOR a[],int n,char b[])//次函数是用来输出长度为n的工人数组的信息 int i;printf("工号\t姓名\t性别\t年龄\n");  for(i=0;i<6;i++)if(strcmp(a[i].sex,b)==0) printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay); void main()WOR a[6]= "0001","陈文杰","男",1200,"0002","张三丰","女",5000,"0003","张四丰","女",1200, "0004","张五丰","男",2200,"0005","张六丰","男",5200,"0006","张七丰","男",6200 ;char b[10];printf("请输入您要查询的性别 :\n");scanf("%s",b);QueryBySex(a,6,b);

案例二、

让用户输入一个工号,然后在一个结构体数组当中去查找有没有这个工人,如果有则输出这个工人的信息,如果没有则找不到此人

#include typedef struct workerchar id[10];char name[10];char sex[10];int pay;WOR;void FindById(WOR a[],int n,char id[])//我们要访问数组里面每一个工人,如果发现了一个工人,就退出循环。如果找不到就输出找不到此人int i;for(i=0;i<n;i++)if(strcmp(a[i].id,id)==0)//说明第i个工人就是我们要找的职工 break;//强制终止循环  //在退出循环之后,再来检查i与n的关系if(i<n)//说明循环在中途就break,发现了职工 printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay); else//找不到职工 printf("找不到此人");void main()WOR a[6]= "0001","陈文杰","男",1200,"0002","张三丰","女",5000,"0003","张四丰","女",1200,"0004","张五丰","男",2200,"0005","张六丰","男",5200,"0006","张七丰","男",6200 ;char b[10];printf("请输入您要查询的id :\n");gets(b);FindById(a,6,b);

案例三、

求出所有职工中最高工资那个职工的信息
注意:这里有一个知识点:成员比较整体赋值

#include #includetypedef struct workerchar id[10];char name[10];char sex[10];int pay;WOR;void max(WOR a[],int n)WOR m=a[0];int i;for(i=0;i<n;i++)if(m.pay<a[i].pay)//如果m的工资小于a[i]的工资,就把m赋值给a[i]m=a[i];printf("%s\t%s\t%s\t%d\n",m.id,m.name,m.sex,m.pay);//假设第一个工人是最高工资的那个工人  void main()WOR a[6]= "0001","陈文杰","男",1200,"0002","张三丰","女",7000,"0003","张四丰","女",1200,"0004","张五丰","男",2200,"0005","张六丰","男",5200,"0006","张七丰","男",6200 ;max(a,6);


上方程序改进
输出所有工资大于平均工资的职工
1、必须要先求出平均
2、在访问每一个职工,如果发现这个职工的工资要小于平均工资的话,就输出这个职工的信息。

#include #includetypedef struct workerchar id[10];char name[10];char sex[10];int pay;WOR;void QueryByAver(WOR a[],int n)int i;float aver; int sum = 0; //求出总工资 for(i=0;i<n;i++)sum+=a[i].pay;//求出平均工资aver aver =(float)sum/n;printf("平均工资为%f\n",aver);printf("大于平均工资为:\n");//访问每一个职工 for(i=0;i<n;i++)if(a[i].pay>=aver)//如果发现职工的工资大于等于平局工资,就输出对应职工的信息 printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);void main()WOR a[6]= "0001","陈文杰","男",3200,"0002","张三丰","女",7000,"0003","张四丰","女",1200,"0004","张五丰","男",2200,"0005","张六丰","男",5200,"0006","张七丰","男",6200 ;QueryByAver(a,6);


算法变换

#include #include typedef struct stud//定义了一个结构体  char Id[10];//学号 char Name[10];//姓名 int China;//语文成绩int Math;//数学成绩int English;
    

上一篇pdf怎样转成visio

下一篇JS问题JQUERY问题如何让一段函数执行完毕后再执行另一段函数