过冷水诚挚邀请你加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载,**:927550334
过冷水在往期文章中有和大家分享三元相图的绘制,给出的图像比较简单,只是在三元系中简单的绘制了几条线。本期过冷数详细和大家分享一下三元相图的进阶使用
过冷水之前在介绍Matlab数据结构的时候简单的介绍过结构体,实际工作中很少具体应用,在一次偶然的条件下发现Matlab帮助手册上也是突然看到结构体实例:
当时觉得在matlab一堆数据里,这样呈现数据如同excel一样很清晰,灵光咋现就想到可以用在自己的数据呈现工作中,让自己程序显示的更专业点,本期过冷水和大家一起详细了解结构体应用。
结构体构建
结构体由一组域变量构成,是MATLAB存取一组相关但具有不同性质数据的数据类型。
1直接创建
第一次结果 | ||||
反应时间 | 1.2 | 3.5 | 5 | 9 |
反映物浓度 | 10 | 8.5 | 7 | 5 |
第二次结果 | ||||
反应时间 | 2.6 | 5.5 | 10 | |
反映物浓度 | 9 | 6.8 | 4.5 |
可以采用直接赋值定义结构体,将表中第一次实验结果赋给变量Experiment,实验次数,反应时间和反应物浓度分别放置在Sequence、Time和 Concentration的域中,可以采用如下赋值语句完成。
> Experiment.Sequence='Run 1'; Experiment.Time=[1.2 3.5 5 9]; Experiment.Concentration=[10 8.5 7 5]; Experiment Experiment = 包含以下字段的 struct: Sequence: 'Run 1' Time: [1.2000 3.5000 5 9] Concentration: [10 8.5000 7 5]
Experiment是结构体变量名,变量名和不同域名之间用“.”进行分割,这是结构使用上手最快的形式。
2使用结构函数struct()创建
s = struct(field1,value1,...,fieldN,valueN) 创建一个包含多个字段的结构体数组。
如果 value 的所有输入都不是元胞数组,或者 value 中作为元胞数组的所有输入都是标量,则 s 是标量结构体。
如果value 输入是非标量元胞数组,则 s 具有与该元胞数组相同维度。如果两个或多个 value 输入是非标量元胞数组,则它们必须都具有相同的维度。
Experiment=struct('Sequence','Run1','Time',[1.2 3.5 5 9],'Concentration',[9 6.6 4.5]) Experiment = 包含以下字段的 struct: Sequence: 'Run1' Time: [1.2000 3.5000 5 9] Concentration: [9 6.6000 4.5000]
现有两次实验数据,过冷水想把其全部放入结构体该如何做?
Experiment(2)=struct('Sequence','Run2','Time',[2.6 5.5 10],'Concentration',[ 9 6.8 4.5 ]) Experiment = 包含以下字段的 1×2 struct 数组: Sequence Time Concentration
基本完成需求,可是过冷水更想在Matlab中能够更直观的看到数据而不是想要看第一次实验要运行Experiment(1),看第二次实验运行Experiment(2),能够同时看两次实验结果会不会好一点?过冷水做如下尝试
Experiment1=struct('Sequence',{'Run1';'Run2'},'Time',[1.2 3.5 5 9;2.6 5.5 10],'Concentration',[10 8.5 7 5;9 6.8 4.5]) 错误使用 vertcat 要串联的数组的维度不一致。
第一次实验是四个数据,第二次实验三个数据,构建矩阵提醒维度不一致,所以做补0处理
Experiment1=struct('Sequence',{'Run1';'Run2'},'Time',[1.2 3.5 5 9;2.6 5.5 10 0],'Concentration',[10 8.5 7 5;9 6.8 4.5 0]) Experiment1 = 包含以下字段的 2×1 struct 数组: Sequence Time Concentration
语法输入是正确的,可是还是无法实现我们想要的结果,而且补0的方法也太不智能化了,在复杂情况下很不科学。问题肯定可以解决的,过冷教你用新方法来满足更个性化需求。
上述数据是不是看上去也很有规律,Blood Pressure 同时显示两组数据,哎!可以满足我们需求,只不过这个是Table函数,在此过冷水不过多讲Table细节。
T=table([1.2,3.5,5,9;2.6,5.5,10,0]',[10,8.5,7,5;9,6.8,4.5 0] ','VariableNames',{'Time','Concentration'}) T = 4×2 table Time Concentration __________ _____________ 1.2 2.6 10 9 3.5 5.5 8.5 6.8 5 10 7 4.5 9 0 5 0
这个模式可以直接给出两组时间和浓度变化,可是时间还是对不上基本满足需求比struct要直白。那么换种思路,能不能单独做两个Table,然后将其合并起来一起展示?过冷水做如下尝试。
T1 = table({'第一次实验';'第一次实验';'第一次实验';'第一次实验'},[1.2 3.5 5 9 ]',[10 8.5 7 5]','VariableNames',{'Sequence','Time','Concentration'}); T2= table({'第二次实验';'第二次实验';'第二次实验';'第二次实验'},[2.6 5.5 10 0]',[9 6.8 4.5 0]','VariableNames',{'Sequence','Time','Concentration'}); T=[T1;T2]%T=[T1,T2] error,两个表格不可以列并列,只能行转接 T = 8×3 table Sequence Time Concentration _____________ ____ _____________ {'第一次实验'} 1.2 10 {'第一次实验'} 3.5 8.5 {'第一次实验'} 5 7 {'第一次实验'} 9 5 {'第二次实验'} 2.6 9 {'第二次实验'} 5.5 6.8 {'第二次实验'} 10 4.5 {'第二次实验'} 0 0
全部数据都显示出来了,实验次序、时间、浓度全部能对上,But和excel格式还是有点不一样,不够完美,过冷水当时突然奇想,不能使用T=[T1,T2]是因为变量重复原因,那么能不能使用两次Table,将其进行强行并列?做如下尝试:
T1 = table([1.2 3.5 5 9 ]',[10 8.5 7 5]','VariableNames',{'Time','Concentration'}); T2= table([2.6 5.5 10 0]',[9 6.8 4.5 0]','VariableNames',{'Time','Concentration'}); T=table(T1,T2,'VariableNames',{'第一次实验','第二次实验'}) T = 4×2 table 第一次实验 第二次实验 Time Concentration Time Concentration _____________________ _____________________ 1.2 10 2.6 9 3.5 8.5 5.5 6.8 5 7 10 4.5 9 5 0 0
结果显示简直是不要太完美,整过结构显示过程就是结构体的初级入门到高阶应用,数据一目了然。当过冷把这个技术掌握了之后以后数据基本就弃用excel了。这就是过冷水本期想给大家分享的实例,大家快学起来。
过冷水和你分享 matlab读取存储各种文件的方法 文末有独家金曲分享