1. 课程导入与表格数据认知
在工程与科研工作中,我们面对的原始数据往往不是整齐的数值矩阵,而是带有列名、单位、类型混杂、行数不定的“表格”。例如一次材料疲劳试验记录:试样编号是字符串,温度是数值,批次是分类变量,测试时间是日期时间,备注里还可能夹杂缺失值。若用普通数值矩阵 double 存储,列名信息丢失、类型被迫统一、缺失值只能靠约定数字表示,后续筛选与统计极易出错。MATLAB 的 table 与 timetable 正是为解决这类问题而设计的数据容器。
本课程围绕“表格数据处理与批量计算”展开,目标不是记住零散函数,而是建立一条从数据读入、清洗、分组聚合、批量计算到结果导出的完整工作流。学完后,你应当能够面对一份陌生的试验数据表,快速判断其结构、定位异常、按分组批量计算指标,并把结果整理成可交付的表格。
table 与 timetable:两种核心结构
table 是带“列变量名”的二维容器,每一列是一个变量,可以是数值、字符串、分类、逻辑、日期时间甚至元胞。它保留了列名与行数约束:所有列的行数必须一致。访问方式有三种典型写法:圆点访问 T.Temperature 取整列,花括号 T{:,3} 取底层内容,圆括号 T(1:5,:) 取子表并保留表结构。理解这三者的差别是后续所有操作的基础——圆括号切片返回的仍是 table,适合继续用表函数处理;花括号取出的则是普通数组,适合直接做数值运算。
timetable 是 table 的特化版本,强制要求存在一个行时间向量(RowTimes),且该时间必须单调、无重复。它天然支持按时间对齐、重采样、滑动窗口等时序操作。判断标准很简单:如果每一行对应一个明确的时间戳,且你需要做时间对齐或按时间窗口统计,就用 timetable;否则用 table。
一个贯穿课程的实战项目
为了让抽象概念落地,本课程设置一个贯穿始终的示例项目:某材料实验室对三个批次(A、B、C)的试样做拉伸试验,每批次若干试样,记录温度、加载速率、抗拉强度、断裂伸长率与测试时间。原始数据以 CSV 形式给出,存在列名含空格、部分强度值缺失、批次列混用大小写等问题。课程后续章节将逐步完成:用 readtable 读入并指定 VariableNamingRule 保留原始列名;用 ismissing 与 rmmissing 处理缺失;用 groupsummary 按批次计算均值与标准差;用 rowfun 对每个试样计算派生指标;最后用 writetable 输出汇总表。
下面是一段可直接运行的示例代码,演示读入与结构检查的基本动作(数据为教学构造,非实测结果):
T = readtable("tensile_test.csv", ...
VariableNamingRule="preserve");
disp(T.Properties.VariableNames) % 查看列名
summary(T) % 每列类型、缺失、范围
head(T, 5) % 预览前 5 行
class(T) % 确认是 table 还是 timetable
执行 summary 后,应重点观察三件事:每列的数据类型是否符合预期(温度应为 double,批次应为 categorical 或 string)、缺失值数量、数值列的极值是否出现明显离群。若批次列被读成 char 数组而非分类变量,后续分组会按字符逐一比较,效率低且易错,此时应显式转换:T.Batch = categorical(T.Batch)。
学习路径与判断依据
课程按“认知—清洗—分组—批量—时序—交付”推进。判断自己是否掌握某一步,不看是否记住了函数名,而看能否回答三个问题:这一步的输入表结构是什么?操作后表结构发生了什么变化(行数、列数、类型)?如何用 summary 或 head 验证结果符合预期。例如分组聚合后行数应从“试样数”降为“批次数”,若行数未变,说明分组变量选错或误用了逐行函数。
size(T) 与 summary(T),把“结构变化”当作检查点。表格处理的多数错误不是算错,而是行列对应关系在中间步骤被悄悄打乱。需要特别提醒的是,table 的圆括号切片与花括号取值混用是初学者最常见的陷阱:T(:,2) 得到的是单列表,传给只接受数值向量的函数会报错;而 T{:,2} 得到数值列,却丢失了行与列名的对应。养成“先想清楚下一步函数要表还是要数组”的习惯,比记住更多函数更有价值。