MATLAB 中结构数组在灵活处理多段多维数据上的应用

如何用MATLAB实现编程语言上的“字典”数据类型

问题描述

假设有若干个班的学生多科目成绩表,每个班的学生个数不等,考试科目都相同,要求使用 MATLAB 按班级存储成绩表,并遍历所有数据。

这个问题涉及到多个维度的多段数据存储,对于普通的编程语言来说,实现起来非常容易。

C/C++ 可以构造一个结构体储存各个科目的成绩,

struct score {
  vector<int> course1, course2;
};

Python 可以使用二维数组与字典存储,

[
  {
      "course1": [90, 80], # course1课程各个学生的成绩
      "course2": [92, 85]
  }, # 第1个班级
  {
      "course1": [60, 70],
      "course2": [55, 75]
  } # 第2个班级
]

可以看出,这个问题最终会转换成一个三维信息的问题,最外层是各个班级、内层是各个科目、最里层是某个科目具体到某个学生的成绩。经过实践,我尝试了以下的几种解决方案。

解决方案

多维数组

MATLAB 可以创建多维数组,如下采用直接赋值的方式创建一个三维数组

>> a(3,3,3)=1 %创建3*3*3的数组
a(:,:,1) =
     0     0     0
     0     0     0
     0     0     0
a(:,:,2) =
     0     0     0
     0     0     0
     0     0     0
a(:,:,3) =
     0     0     0
     0     0     0
     0     0     1

那么用多维数组能实现最开始提出的问题吗?答案是否定的,因为 MATLAB 是将所有数据都看作“矩阵”,而问题中各个班级的学生个数不一样,构造三维矩阵时势必会按照最多的个数作为维度,维度不足的数组用0填充,这样就无法区分填充的数据与成绩为0的数据,而且给遍历正确的个数造成困难。此外,当考试科目更多时,用下标来选取对应科目的成绩在编程时很容易出错。

结构数组

结构数组是 MATLAB 中的特色数据类型,相当于 Python 的“数组[字典]”结构。也就是说结构数组本质是一个“数组”,数组的每个元素可以指定若干个名称,每个名称对应一个值,而这个值可以是不同类型、不同维度的数据。这样就要比多维数组要求其各个行、列必须是类型相同、维度(长度)相同具有很大的优势。

创建结构数组的方法

  1. 可以先声明再赋值(也可以不用写声明语句,直接赋值)
data = struct([]);
data(1).course1 = [90 80];
data(2).course2 = [55 75];
  1. 也可以用struct()函数创建

struct(field1,value1,...,fieldN,valueN)

data(1) = struct('course1', [90 80], 'course2', [92 85]);

假如,要读取第1个班级,course2课程的第2个学生的成绩,按下面的语句执行即可

>> data(1).course1(2)
80

假如要遍历整个结构数组,用length()取得结构数组的长度,for循环执行即可

n = length(data);
for i=1:n
    disp( data(i).course1 )
end
% [90 80]
% [60 70]

单位数组(元胞数组)

与结构数组类似,单位数组也可以在每个元素存储不同类型的数据。但单元数组是用下标来定位,使用起来不如结构数组方便。

>> a = cell(2,3)
a = 
    []    []    []
    []    []    []

参考来源

matlab学习——多维数组_我有嘉宾德音孔昭的博客-CSDN博客_matlab 多维数组

如何将不同维度的数组放到同一个矩阵中? – MATLAB中文论坛 (ilovematlab.cn)

matlab多维数组、结构体数组 - zhouerba - 博客园 (cnblogs.com)

Matlab基础之单元数组和结构数组_ 五仁月饼哭了的博客-CSDN博客_matlab 结构数组