首页/文章/ 详情

过冷水:Matlab结构体高阶显示实用案例

2年前浏览2344

image.png

 过冷水诚挚邀请你加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载,**:927550334

QQ图片20210424105303.png

    过冷水在往期文章中有和大家分享三元相图的绘制,给出的图像比较简单,只是在三元系中简单的绘制了几条线。本期过冷数详细和大家分享一下三元相图的进阶使用


过冷水之前在介绍Matlab数据结构的时候简单的介绍过结构体,实际工作中很少具体应用,在一次偶然的条件下发现Matlab帮助手册上也是突然看到结构体实例:

image.png

当时觉得在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,实验次数,反应时间和反应物浓度分别放置在SequenceTimeConcentration的域中,可以采用如下赋值语句完成。

> 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的方法也太不智能化了,在复杂情况下很不科学。问题肯定可以解决的,过冷教你用新方法来满足更个性化需求。

image.png 

    上述数据是不是看上去也很有规律,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绘制农夫过河动态图

分子动力学的原子空间运动轨迹演示编程

过冷水带你用matlab制作演示动画

python批量移动文件&重命名代码分享

过冷水和你分享 matlab读取存储各种文件的方法 文末有独家金曲分享

image.png

MATLAB
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-04-26
最近编辑:2年前
过冷水
博士 | 讲师 讨论号:927550334
获赞 359粉丝 184文章 107课程 11
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈