假设有若干个班的学生多科目成绩表,每个班的学生个数不等,考试科目都相同,要求使用 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 的“数组[字典]”结构。也就是说结构数组本质是一个“数组”,数组的每个元素可以指定若干个名称,每个名称对应一个值,而这个值可以是不同类型、不同维度的数据。这样就要比多维数组要求其各个行、列必须是类型相同、维度(长度)相同具有很大的优势。
创建结构数组的方法
data = struct([]);
data(1).course1 = [90 80];
data(2).course2 = [55 75];
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 结构数组