怎么样在MATLAB中读取结构体中的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么样在MATLAB中读取结构体中的数据相关的知识,希望对你有一定的参考价值。

简单,使用fieldnames()函数查看有哪些成员,使用getfield()函数查看成员数据,比如:
>> a.x1 = 123;
>> a.x2 = 'a string';
>> a.x3 = [1,2,3,4,5];

>> fieldnames(a) % 返回成员名称列表
ans =
'x1'
'x2'
'x3'
>> getfield(a,'x1') % 查看某一成员的值
ans =
123
参考技术A 如果有人问你何为一个好的Matlab程序?你是不是会说耗时少、消耗内存小、可读性高、可靠性强,可移植/维护/拓展等等。那么,你最在意是哪条呢?

通常Matlab程序并不是最终产品,仅是产品开发流程中的一个中间验证环节,不需要直接面向广大消费者。此时,你通常会不注重Matlab对内存的消耗,直接使用其默认的占八个字节的双精度数据类型。如果编程时遇到内存消耗和耗时出现冲突时,你还会以付出内存为代价来减少仿真时间。

开发效率属于高效编程的范畴,如果你是为了验证一个问题而临时编程,以后不会再用的话,就没必要耗费过多的精力在高效编程上。但是,如果Matlab仿真耗时的多少会严重影响到整个产品的开发进度,那么减少仿真时间就十分必要了。

今天,我们将和大家聊一聊在兼顾其他优良编程习惯的同时可以在减少Matlab仿真耗时上的“小常识”。在探讨之前,我们首先要知道如何评估一段程序仿真需要的时间。

评估运行时间的方法

最简单的方法就是在你需要计算的代码前加tic,在代码后加toc,测算tic和toc之间代码的耗时。但是,如果你需要详细统计程序中每个函数的耗时,那么你还可以采用profile工具来评估。

数据类型的选择

在大多数情况下,Matlab数据类型为占用8个字节的双精度型,这除了会占用较多内存,还可能拖慢程序的运行速度。其实常用的数据类型除了数值型,还有逻辑型(logical)、字符型(char)、结构体型(struct)等等。数值型包括整型、单精度型和双精度型,整型又可分成多种。

不同的数据类型在存储和访问效率上各不相同,选择合适的数据类型除了可以节省内存空间,还可以提升运行速度。另外,某一个变量在改变数据类型时会消耗额外的时间,因此还不如重新建一个新变量。

预分配内存

我们知道Matlab可以在不定义变量时可以直接赋值,这种规则给我们带来了方便,但同时也带来了一些容易被忽视的问题。在循环体中,如果没有预先为某一矩阵分配内存空间,而该矩阵会随着循环变化,那么它将在每次循环时都浪费额外的时间去寻找满足需求的内存空间,将改变大小后的矩阵整体移动到这个新的内容空间中,并释放原来的内存空间,这除了会影响代码的运行效率,还容易形成内存碎片,让程序越来越难找到满足条件的内存。

因此在循环前给矩阵预分配内存是很一个良好的习惯,如果没有这个习惯,你还可以通过Matlab自带的代码检查器来查看是否存在类似问题。

列优先

在Matlab中矩阵的存储是按列优先的,并且下标是从1开始的,这二点是与C++是不同的,需要初学者稍加注意。对于矩阵的操作,可以通过下标索引,也可以通过线性索引来访问元素,由于Matlab是按列优先存储的,则其线性索引是按列递增的。如果处理时按列操作会比按行操作提升程序的运行效率哦。

向量化编程代替“循环”

内存对齐

环境

  • 32位操作系统

通过结构体的内存字节对齐了解操作系统的内存对齐

  • 在32位操作系统中, CPU默认读和写数据是按照4字节的方式
  • 在一个结构体中, 在编译的时候, 编译器会根据结构体中的成员变量使其内存对齐, 让他们都是符合让CPU一次读取的数据而不用再读取一次数据, 减少了读取的次数
  • 下面通过案例讲解

1. 
    struct s {
        char c; // 占用1个字节
        int i; // 占用4个字节
        short s; // 占用2个字节
    }stu;
    如果不对齐的话, 则c与i的前3个字节在同一个4字节内, s和i的后1个字节在另外一个4字节内, 当使用stu.i访问的时候, CPU要读取第一个4字节获取i的前三个字节的数据, 在读取后4个字节获取i的后一个字节的数据, 接受处理数据拿出i的值
    如果对齐的话, 在编译器会自动添加一些无关的变量对数据进行填充, 使得c一个4字节, i一个4字节, s一个4字节, 这样获取stu.i就是一个内存访问了, 该结构体占了12个字节

2. 
    struct s {
        char c;
        short t;
        int i;
        char ch;
    };
    编译器的对齐方式中, c和t是在同一个4字节中的, 因为CPU一次性就可以读取出来一个4字节, CPU在过滤一下就可以取出c的值了, 这样节省了内存

以上是关于怎么样在MATLAB中读取结构体中的数据的主要内容,如果未能解决你的问题,请参考以下文章

matlab中如何看函数结构体中的数据

MATLAB如何提取结构体中数据

matlab中怎样读取结构体某字段

matlab 怎么将374个结构体数据保存在一个数组中?用哪个函数

matlab中的结构体

关于matlab程序中的结构体