MATLAB 中结构数组在灵活处理多段多维数据上的应用
问题描述
假设有若干个班的学生多科目成绩表,每个班的学生个数不等,考试科目都相同,要求使用 MATLAB 按班级存储成绩表,并遍历所有数据。
这个问题涉及到多个维度的多段数据存储,对于普通的编程语言来说,实现起来非常容易。
C/C++ 可以构造一个结构体储存各个科目的成绩,
Python 可以使用二维数组与字典存储,
可以看出,这个问题最终会转换成一个三维信息的问题,最外层是各个班级、内层是各个科目、最里层是某个科目具体到某个学生的成绩。经过实践,我尝试了以下的几种解决方案。
解决方案
多维数组
MATLAB 可以创建多维数组,如下采用直接赋值的方式创建一个三维数组
那么用多维数组能实现最开始提出的问题吗?答案是否定的,因为 MATLAB 是将所有数据都看作“矩阵”,而问题中各个班级的学生个数不一样,构造三维矩阵时势必会按照最多的个数作为维度,维度不足的数组用0填充,这样就无法区分填充的数据与成绩为0的数据,而且给遍历正确的个数造成困难。此外,当考试科目更多时,用下标来选取对应科目的成绩在编程时很容易出错。
结构数组
结构数组是 MATLAB 中的特色数据类型,相当于 Python 的“数组[字典]”结构。也就是说结构数组本质是一个“数组”,数组的每个元素可以指定若干个名称,每个名称对应一个值,而这个值可以是不同类型、不同维度的数据。这样就要比多维数组要求其各个行、列必须是类型相同、维度(长度)相同具有很大的优势。
创建结构数组的方法
可以先声明再赋值(也可以不用写声明语句,直接赋值)
也可以用
struct()
函数创建
struct(field1,value1,...,fieldN,valueN)
假如,要读取第1个班级,course2课程的第2个学生的成绩,按下面的语句执行即可
假如要遍历整个结构数组,用length()
取得结构数组的长度,for
循环执行即可
单位数组(元胞数组)
与结构数组类似,单位数组也可以在每个元素存储不同类型的数据。但单元数组是用下标来定位,使用起来不如结构数组方便。