简介:在MATLAB中识别和处理模拟表数据是数据分析和工程建模的重要基础。模拟表通常由实验、仿真或计算生成,MATLAB通过 table
数据类型提供了结构化存储和高效操作的方式。本文详细讲解了模拟表的创建、查看、操作、统计分析、可视化、格式转换及高级应用,涵盖 readtable
、 writetable
、 groupsummary
等关键函数,并指导读者掌握从数据导入到分析输出的完整流程,适用于信号处理、模型构建等多个工程领域。
1. MATLAB模拟表的基本概念与应用背景
在MATLAB的数据处理体系中, table
(模拟表)是一种高度结构化的数据类型,专为组织、管理和分析异构数据而设计。与传统的矩阵或数组相比, table
不仅支持多种数据类型的混合存储,还允许通过变量名进行直观访问,极大提升了数据处理的可读性与效率。
模拟表的核心优势在于其具备清晰的行列结构:每一列代表一个变量(如温度、时间等),每一行则代表一个观测或记录。这种结构天然适用于工程建模、实验数据分析、金融数据处理等领域,特别是在需要对多维数据进行逻辑化组织时表现尤为突出。
本章将从MATLAB整体数据类型出发,引出 table
的结构特性,并通过实际工程场景说明其广泛应用价值。
2. table数据类型的创建与结构管理
在MATLAB中, table
是一种专门用于组织和处理结构化数据的数据类型,其设计灵感来源于数据库中的“表”结构。 table
允许将不同类型的数据(如数值、字符串、分类变量等)按列组织,每一列代表一个变量,每一行代表一个观测或样本。这种结构不仅提升了数据的可读性,也为后续的数据处理、分析和可视化提供了极大的便利。
本章将深入探讨 table
的创建方式与结构管理方法。我们将从其基本构成入手,逐步介绍如何从不同来源构造 table
对象,并讲解如何对其结构进行初始化、修改与维护。通过本章内容,读者将掌握创建与管理 table
的多种方法,并具备灵活处理结构化数据的能力。
2.1 table数据类型的基本构成
table
是一种列导向的数据结构,其核心元素包括变量(列)、变量名称、行标签以及每列的数据类型。理解这些基本构成是掌握 table
操作的前提。
2.1.1 表的变量与行标签
在 table
中,每列代表一个变量,每行代表一个观测(observation)。变量可以是数值型、字符型、字符串型、逻辑型,甚至可以是分类变量(categorical)等类型。行标签(Row Names)是 table
的一个可选属性,它为每一行提供了一个唯一的标识符,通常用于表示样本名称或时间戳等信息。
例如,我们可以创建一个包含学生成绩的 table
,其中每一行表示一个学生,每一列表示一个科目或属性:
% 创建学生姓名作为行标签
rowNames = {'Alice'; 'Bob'; 'Charlie'};
% 创建成绩数据
scores = [85, 92, 78;
76, 88, 90;
90, 85, 82];
% 构建 table
T = array2table(scores, 'RowNames', rowNames, 'VariableNames', {'Math', 'English', 'Science'});
执行结果如下:
Math English Science
_____ _______ _______
Alice 85 92 78
Bob 76 88 90
Charlie 90 85 82
在这个例子中:
-
Math
、English
、Science
是变量名(Variable Names),每一列对应一个科目。 -
Alice
、Bob
、Charlie
是行标签(Row Names),标识了每一行对应的样本。 -
scores
是一个3x3的数值矩阵,作为表的主体数据。
逻辑分析 :
- array2table
函数将数值矩阵转换为 table
对象。
- 'RowNames'
参数指定了行标签。
- 'VariableNames'
参数定义了变量名。
2.1.2 变量名称与数据类型的设定
在 table
中,每个变量必须有唯一的名称,并且每一列的数据类型可以不同。例如,一列可以是数值型,另一列可以是字符串型。我们可以通过 table
函数直接构造,并为每列指定不同的数据类型。
% 创建不同类型的列数据
names = {'Alice'; 'Bob'; 'Charlie'};
ages = [23; 25; 22];
grades = [3.8; 3.5; 4.0];
isGraduate = logical([1; 0; 1]);
% 构建 table
T = table(names, ages, grades, isGraduate);
执行结果如下:
names ages grades isGraduate
_______ ____ ______ __________
'Alice' 23 3.8 true
'Bob' 25 3.5 false
'Charlie' 22 4 true
逻辑分析 :
- 每一列的数据类型分别为字符数组、整数、浮点数和逻辑值。
- MATLAB自动为列分配默认变量名(如 names
、 ages
等)。
- 如果不指定变量名,MATLAB将使用 Var1
、 Var2
等默认命名。
表格:常见变量类型及其示例
数据类型 | 示例数据 | 说明 |
---|---|---|
double | [1.2, 3.5, 4.7] | 默认数值类型 |
int8/int16 | int8([1, 2, 3]) | 整型数据,节省内存 |
categorical | categorical({‘A’,’B’,’A’}) | 分类变量,适用于枚举类型 |
string | [“red”, “blue”] | 字符串数组 |
cell | {‘text’, 123} | 单元格数组,可存储异构数据 |
logical | logical([1, 0, 1]) | 逻辑值,常用于条件判断 |
2.2 创建table的多种方法
MATLAB提供了多种方式来创建 table
对象,适用于不同数据来源和格式。常见的创建方法包括从矩阵、单元格数组、结构体转换,以及直接使用 table
函数构造。
2.2.1 从矩阵和数组创建
如果数据是数值矩阵或数组,可以使用 array2table
函数将其转换为 table
。该方法适用于数值型数据的快速导入。
% 定义数值矩阵
data = [1, 2, 3;
4, 5, 6;
7, 8, 9];
% 转换为 table
T = array2table(data, 'VariableNames', {'A', 'B', 'C'});
执行结果如下:
A B C
_ _ _
1 2 3
4 5 6
7 8 9
逻辑分析 :
- array2table
将矩阵转换为 table
,并自动将每列命名为 A
、 B
、 C
。
- 该方法适用于所有列数据类型一致的情况。
2.2.2 从单元格数组和结构体创建
如果数据以单元格数组或结构体形式存在,也可以转换为 table
。这对于处理异构数据特别有用。
单元格数组转换
% 定义单元格数组
data = {'Alice', 23, 3.8;
'Bob', 25, 3.5;
'Charlie', 22, 4.0};
% 转换为 table
T = cell2table(data, 'VariableNames', {'Name', 'Age', 'GPA'});
执行结果如下:
Name Age GPA
_______ ___ ____
Alice '23' '3.8'
Bob '25' '3.5'
Charlie '22' '4.0'
逻辑分析 :
- 单元格数组中的每个元素可以是不同类型。
- 转换后,所有列的数据类型为 cell
,如需进一步处理可使用 convertvars
函数转换类型。
结构体转换
% 定义结构体数组
S(1).Name = 'Alice'; S(1).Age = 23; S(1).GPA = 3.8;
S(2).Name = 'Bob'; S(2).Age = 25; S(2).GPA = 3.5;
S(3).Name = 'Charlie'; S(3).Age = 22; S(3).GPA = 4.0;
% 转换为 table
T = struct2table(S);
执行结果如下:
Name Age GPA
_______ ___ ___
Alice 23 3.8
Bob 25 3.5
Charlie 22 4.0
逻辑分析 :
- 结构体字段自动转换为 table
的变量。
- 每个结构体元素对应 table
中的一行。
2.2.3 利用函数table直接构造
table
函数是创建 table
最灵活的方式,支持将多个列数据组合成一个表。
% 定义各列数据
names = {'Alice'; 'Bob'; 'Charlie'};
ages = [23; 25; 22];
gpas = [3.8; 3.5; 4.0];
% 构建 table
T = table(names, ages, gpas, 'VariableNames', {'Name', 'Age', 'GPA'});
执行结果如下:
Name Age GPA
_______ ___ ___
Alice 23 3.8
Bob 25 3.5
Charlie 22 4.0
逻辑分析 :
- table
函数将多个列向量组合为一个 table
。
- 支持不同数据类型混合,灵活性高。
2.3 table结构的初始化与修改
创建 table
后,通常需要对其进行结构上的修改,包括添加或删除变量列、插入或移除行数据,以及修改变量属性。
2.3.1 添加与删除变量列
添加新列可以使用赋值语法,删除列可以使用空矩阵赋值。
% 添加新列:是否毕业
T.IsGraduate = logical([1; 0; 1]);
% 删除 GPA 列
T.GPA = [];
修改后的表如下:
Name Age IsGraduate
_______ ___ __________
Alice 23 true
Bob 25 false
Charlie 22 true
逻辑分析 :
- T.NewColumnName = value
方式添加新列。
- T.ColumnName = []
方式删除指定列。
2.3.2 插入与移除行数据
插入新行可以使用 vertcat
函数,移除行可以使用索引删除。
% 插入新行
newRow = table('David', 24, true, 'VariableNames', {'Name', 'Age', 'IsGraduate'});
T = vertcat(T, newRow);
% 移除第二行
T(2, :) = [];
逻辑分析 :
- vertcat
用于垂直拼接两个 table
对象。
- 索引 T(2, :) = []
表示删除第二行。
2.3.3 修改表变量属性
使用 setvaropts
和 setvartype
函数可以修改变量的属性和数据类型。
% 将 Age 列转换为整数类型
T = setvartype(T, 'Age', 'int8');
% 设置 Name 列为分类变量
T = setvaropts(T, 'Name', 'Type', 'categorical');
逻辑分析 :
- setvartype
用于更改变量的数据类型。
- setvaropts
用于设置变量的属性,如分类变量、缺失值处理等。
流程图:table结构管理操作流程
graph TD
A[创建 table] --> B[添加列]
A --> C[删除列]
A --> D[添加行]
A --> E[删除行]
A --> F[修改变量属性]
B --> G[使用赋值语法]
C --> H[使用空矩阵赋值]
D --> I[使用 vertcat]
E --> J[使用索引删除]
F --> K[使用 setvartype/setvaropts]
通过上述内容,我们系统地介绍了 table
的基本构成、创建方法及其结构管理方式。下一章将深入探讨如何查看 table
属性与进行变量操作。
3. 模拟表属性查看与变量操作技巧
在MATLAB中, table
数据结构以其灵活的数据组织方式广泛应用于数据预处理、统计分析与建模等场景。掌握 table
的属性查看与变量操作技巧,是高效处理复杂数据集的关键。本章将深入讲解如何获取和管理表属性、如何对变量进行高级操作(如重命名、排序、类型转换、变量合并等),以及如何处理表中的缺失值与异常值。
3.1 表属性的查看与管理
在处理 table
对象时,了解其结构属性是进行数据操作的前提。MATLAB提供了多种内置函数来查看表的变量名称、数据类型、行标签、表维度等信息。
3.1.1 获取表变量名称与数据类型
使用 Properties
结构可以访问 table
的元数据,包括变量名称( VariableNames
)、变量数据类型( VariableTypes
)等。
% 创建一个示例table
T = table([1;2;3], {'A';'B';'C'}, [10.5; NaN; 30.2], 'VariableNames', {'ID', 'Category', 'Value'});
disp(T);
% 获取变量名称
varNames = T.Properties.VariableNames;
disp('变量名称:');
disp(varNames);
% 获取变量数据类型
varTypes = T.Properties.VariableTypes;
disp('变量数据类型:');
disp(varTypes);
代码分析:
- T.Properties.VariableNames
:返回表中所有列的名称。
- T.Properties.VariableTypes
:返回每个列的数据类型(如 double
、 cell
、 double
等)。
- disp
函数用于输出结果。
执行结果示例:
ID Category Value
__ ________ _____
1 'A' 10.5
2 'B' NaN
3 'C' 30.2
变量名称:
'ID' 'Category' 'Value'
变量数据类型:
'double' 'cell' 'double'
3.1.2 查看表维度与行标签信息
可以通过 size
函数获取表的行数和列数,也可以使用 RowNames
属性查看行标签。
% 查看表维度
dims = size(T);
disp(['表维度:', num2str(dims(1)), '行,', num2str(dims(2)), '列']);
% 设置行标签并查看
T.Properties.RowNames = {'Row1', 'Row2', 'Row3'};
rowNames = T.Properties.RowNames;
disp('行标签:');
disp(rowNames);
执行结果:
表维度:3行,3列
行标签:
'Row1' 'Row2' 'Row3'
说明:
- size(T)
:返回 table
的行列数。
- T.Properties.RowNames
:用于设置或获取行标签,便于后续按行名访问数据。
3.2 变量操作的进阶方法
在实际数据分析中,常常需要对变量进行重命名、排序、类型转换或合并等操作,以满足后续建模需求。
3.2.1 对变量进行重命名与排序
可以使用 renamevars
函数对变量进行重命名,使用 reordervars
函数对变量列进行排序。
% 重命名变量
T_renamed = renamevars(T, 'ID', 'Identifier');
disp('重命名后的表:');
disp(T_renamed);
% 排序变量列
T_reordered = reordervars(T_renamed, {'Value', 'Identifier', 'Category'});
disp('排序后的表:');
disp(T_reordered);
执行结果:
重命名后的表:
Identifier Category Value
__________ ________ _____
1 'A' 10.5
2 'B' NaN
3 'C' 30.2
排序后的表:
Value Identifier Category
_____ __________ ________
10.5 1 'A'
NaN 2 'B'
30.2 3 'C'
参数说明:
- renamevars(T, oldName, newName)
:将 oldName
列重命名为 newName
。
- reordervars(T, order)
:按指定顺序重新排列列。
3.2.2 变量数据类型的转换与标准化
在数据建模中,变量类型的一致性至关重要。MATLAB提供了多种方式将变量转换为期望的数据类型。
% 将Category列转换为分类变量
T.Category = categorical(T.Category);
disp('转换后的数据类型:');
disp(T.Properties.VariableTypes);
% 标准化数值变量
T.Value = normalize(T.Value);
disp('标准化后的表:');
disp(T);
执行结果:
转换后的数据类型:
'double' 'categorical' 'double'
标准化后的表:
Identifier Category Value
__________ ________ ______
1 A -1.0000
2 B NaN
3 C 1.0000
逻辑分析:
- categorical()
:将字符数组转换为分类变量,节省内存并提升计算效率。
- normalize()
:对数值型变量进行标准化(Z-score),适用于后续建模如聚类、回归等。
3.2.3 多变量之间的运算与合并
变量之间可以进行数学运算,也可以将多个 table
对象进行横向或纵向合并。
% 添加新列进行变量运算
T.Ratio = T.Identifier ./ T.Value;
disp('添加运算列后的表:');
disp(T);
% 合并两个表
T2 = table([4;5], {'D';'E'}, [40.1; 50.3], 'VariableNames', {'ID', 'Category', 'Value'});
T_combined = [T; T2];
disp('合并后的表:');
disp(T_combined);
执行结果:
添加运算列后的表:
Identifier Category Value Ratio
__________ ________ ______ ______
1 A -1.0000 -1
2 B NaN NaN
3 C 1.0000 3
合并后的表:
Identifier Category Value Ratio
__________ ________ ______ ______
1 A -1.0000 -1
2 B NaN NaN
3 C 1.0000 3
4 D 40.1 0.1
5 E 50.3 0.099
操作说明:
- ./
:逐元素除法。
- [T; T2]
:纵向合并两个表,要求列名一致。
3.3 缺失值与异常值处理
数据清洗是数据分析中不可或缺的环节。MATLAB提供了多种方法用于检测和处理缺失值和异常值。
3.3.1 缺失值的检测与填充
使用 ismissing
函数检测缺失值,使用 fillmissing
函数进行填充。
% 检测缺失值
missingIdx = ismissing(T);
disp('缺失值位置:');
disp(missingIdx);
% 填充缺失值
T_filled = fillmissing(T, 'constant', 0); % 用0填充
disp('填充后的表:');
disp(T_filled);
执行结果:
缺失值位置:
Identifier Category Value Ratio
__________ ________ _____ _____
false false true true
true false false true
false false false false
填充后的表:
Identifier Category Value Ratio
__________ ________ ______ ______
1 A -1.0000 -1
0 B 0.0000 0
3 C 1.0000 3
参数说明:
- 'constant'
:表示用指定常量填充缺失值。
- 也可以使用插值法(如线性插值、样条插值等)进行填充。
3.3.2 异常值的识别与修正
使用 isoutlier
函数识别异常值,使用 filloutliers
进行替换。
% 识别异常值
outlierIdx = isoutlier(T.Value);
disp('异常值位置:');
disp(outlierIdx);
% 修正异常值
T_corrected = filloutliers(T, 'nearest', 'DataVariables', 'Value');
disp('修正后的表:');
disp(T_corrected);
执行结果:
异常值位置:
0
1
0
修正后的表:
Identifier Category Value Ratio
__________ ________ ______ ______
1 A -1.0000 -1
2 B -1.0000 NaN
3 C 1.0000 3
参数说明:
- 'nearest'
:用最近邻值替换异常值。
- DataVariables
:指定要处理的变量列。
3.3.3 缺失值与异常值处理流程图
使用 mermaid
格式绘制数据清洗流程图,帮助理解整体处理逻辑。
graph TD
A[开始处理表数据] --> B{检测缺失值?}
B -->|是| C[填充缺失值]
B -->|否| D{检测异常值?}
D -->|是| E[修正异常值]
D -->|否| F[完成数据清洗]
C --> D
E --> F
3.3.4 数据清洗参数配置表
参数名称 | 描述 | 可选值示例 |
---|---|---|
'method' | 缺失值填充方法 | 'constant' , 'linear' |
'fillvalue' | 填充缺失值的常量值 | 0 , 'missing' |
'outliermethod' | 异常值检测方法 | 'median' , 'mean' |
'replacevalue' | 替换异常值的方法 | 'nearest' , 'clip' |
本章通过系统讲解表属性的获取、变量操作的进阶技巧以及缺失值与异常值的处理,帮助读者全面掌握MATLAB中 table
对象的核心操作。这些技能不仅适用于日常数据预处理任务,也为后续的建模与分析打下坚实基础。
4. 表数据的访问、索引与筛选方法
在工程建模和数据分析中,数据的访问、索引与筛选是进行数据操作和处理的核心环节。MATLAB 的 table
数据结构为这些操作提供了高度灵活且高效的机制。通过变量名、行索引、逻辑索引等多种方式,用户可以快速精准地提取所需子集,支持后续的统计分析、可视化或建模任务。本章将系统地介绍 table
中数据访问与筛选的多种方法,涵盖基础操作到高级技巧,并通过示例代码说明其具体实现。
4.1 表数据的访问方式
table
类型的访问方式多种多样,主要包括按变量名访问列数据、按行索引访问行数据以及混合索引与逻辑索引。这些方法构成了数据提取的基础,是进行进一步处理和分析的前提。
4.1.1 按变量名访问列数据
在 table
结构中,每一列代表一个变量,变量名是访问该列数据的重要标识。使用变量名访问列数据的方式简洁明了,适用于变量命名规范且易于识别的场景。
% 创建一个示例 table
Name = {'Alice'; 'Bob'; 'Charlie'};
Age = [25; 30; 35];
Salary = [50000; 60000; 70000];
T = table(Name, Age, Salary);
% 按变量名访问 Age 列
ageData = T.Age;
disp(ageData);
代码逻辑分析:
- 第1~4行创建了一个包含姓名、年龄和薪资的 table
。
- 第7行使用点号 .
语法访问 T
中名为 Age
的列,返回该列的数值向量。
- disp
函数输出结果,显示 Age
列的数据。
参数说明:
- T.Age
:访问 table
中变量名为 Age
的列,返回一个向量。
4.1.2 按行索引访问行数据
除了按列访问,我们还可以按行索引来提取特定行。这种操作方式常用于数据采样或分块处理。
% 提取第二行数据
row2 = T(2, :);
disp(row2);
代码逻辑分析:
- 使用 T(2, :)
表示提取 table
中第2行的所有列。
- 冒号 :
表示该维度的全部内容。
- 输出结果为一个包含一行数据的子表。
参数说明:
- 2
:行索引,表示第2行。
- :
:表示所有列。
4.1.3 混合索引方式与逻辑索引
混合索引是指结合变量名和行索引对数据进行访问,而逻辑索引则是基于布尔值的索引方式,用于筛选满足特定条件的行。
% 使用混合索引访问第一行的 Salary 列
salaryFirstRow = T.Salary(1);
disp(salaryFirstRow);
% 使用逻辑索引提取年龄大于30的行
filteredRows = T(T.Age > 30, :);
disp(filteredRows);
代码逻辑分析:
- 第3行使用混合索引方式访问 Salary
列的第一个元素。
- 第6行使用逻辑索引表达式 T.Age > 30
返回一个逻辑向量,表示哪些行满足条件,然后用该逻辑向量提取符合条件的子表。
参数说明:
- T.Salary(1)
:获取 Salary
变量中的第一个元素。
- T.Age > 30
:生成一个逻辑数组,值为 true
的位置对应年龄大于30的行。
4.2 数据筛选与子集提取
在实际工程建模中,常常需要根据特定条件筛选数据,以提取感兴趣的数据子集。本节将介绍如何利用条件筛选、逻辑表达式、 find
函数等方式实现高效的数据提取。
4.2.1 条件筛选与逻辑表达式应用
条件筛选是数据分析中最常见的操作之一,通常通过逻辑表达式来实现。逻辑表达式的结果是一个布尔向量,用于标识哪些行满足条件。
% 提取薪资大于60000的员工信息
highEarners = T(T.Salary > 60000, :);
disp(highEarners);
代码逻辑分析:
- T.Salary > 60000
生成一个逻辑数组,表示哪几行的薪资大于60000。
- 用该逻辑数组作为索引提取子表 highEarners
。
参数说明:
- T.Salary > 60000
:逻辑条件,用于筛选符合条件的行。
4.2.2 使用find函数与逻辑索引提取子表
find
函数可以将逻辑索引转换为对应的行号索引,适用于某些需要整数索引的场景。
% 找出薪资大于60000的行号
rowIndices = find(T.Salary > 60000);
% 使用行号提取子表
subTable = T(rowIndices, :);
disp(subTable);
代码逻辑分析:
- find(T.Salary > 60000)
返回满足条件的行号索引。
- 使用这些行号索引提取对应的子表。
参数说明:
- rowIndices
:满足条件的行号,可用于整数索引。
- T(rowIndices, :)
:提取对应行号的所有列数据。
表格:逻辑索引与整数索引的对比
方法 | 特点 | 适用场景 |
---|---|---|
逻辑索引 | 直接使用布尔数组筛选数据,简洁高效 | 条件筛选、快速提取 |
整数索引 | 需要先用 find 获取索引,适合后续迭代 | 需要索引编号的循环或迭代操作 |
4.3 高级索引技巧
在复杂的数据处理任务中,仅靠基本索引方式往往难以满足需求。本节将介绍更高级的索引技巧,如基于行标签的查找、多条件筛选与嵌套索引的应用,以提升数据操作的灵活性和效率。
4.3.1 使用行标签进行快速查找
如果 table
具有行标签(即 RowNames
属性),可以通过行标签直接访问特定行,这种方式特别适用于以字符串作为标识的场景。
% 创建带有行标签的 table
T = table(Age, Salary, 'RowNames', Name);
% 通过行标签访问 Charlie 的数据
charlieData = T('Charlie', :);
disp(charlieData);
代码逻辑分析:
- 第1~2行创建 table
时指定 RowNames
为 Name
,即行标签为姓名。
- 第5行使用字符串 'Charlie'
作为行标签访问对应的行。
参数说明:
- 'Charlie'
:行标签名称,用于直接访问对应行。
4.3.2 多条件筛选与嵌套索引应用
在实际工程中,数据筛选往往涉及多个条件的组合。此时,可以使用逻辑运算符(如 &
、 |
、 ~
)进行多条件筛选,或者通过嵌套索引实现更复杂的查询逻辑。
% 筛选年龄大于25且薪资小于65000的员工
selectedRows = T(T.Age > 25 & T.Salary < 65000, :);
disp(selectedRows);
代码逻辑分析:
- 使用 &
运算符组合两个条件:年龄大于25 且 薪资小于65000。
- 逻辑表达式的结果作为索引提取子表。
参数说明:
- T.Age > 25
:第一个筛选条件。
- T.Salary < 65000
:第二个筛选条件。
- &
:逻辑与,表示两个条件同时成立。
mermaid 流程图:多条件筛选流程
graph TD
A[开始筛选] --> B{条件1: 年龄 > 25?}
B -- 是 --> C{条件2: 薪资 < 65000?}
C -- 是 --> D[保留该行]
C -- 否 --> E[排除该行]
B -- 否 --> E
D --> F[继续处理]
E --> F
流程说明:
1. 首先判断年龄是否大于25;
2. 若是,则进一步判断薪资是否小于65000;
3. 若两个条件都满足,则保留该行数据;
4. 否则排除该行;
5. 最后继续后续处理。
通过本章的深入介绍,读者可以掌握从基础访问到高级索引的各种技巧。这些方法不仅提升了数据操作的效率,也为后续的数据分析与建模奠定了坚实基础。在实际工程中,灵活运用这些技巧,将极大提升数据处理的精准度与执行效率。
5. 模拟表的统计分析与分组处理
MATLAB 中的 table
数据结构不仅在数据组织和访问方面具有显著优势,更在统计分析与分组处理上展现出强大的灵活性和高效性。尤其在工程建模、数据分析、科研实验等领域,对数据进行分类汇总、分组统计是常见的需求。本章将从基础统计分析入手,逐步深入到分组统计与进阶分组分析实践,帮助读者掌握利用 table
进行高效统计分析的技巧。
5.1 基础统计分析方法
在数据分析的初期阶段,我们通常需要对数据的基本统计特性进行初步了解。MATLAB 的 table
提供了丰富的内置函数,可以轻松实现变量的均值、方差、标准差、最大值、最小值以及分位数等基础统计指标的计算。
5.1.1 变量的均值、方差与标准差计算
MATLAB 提供了 mean
、 var
、 std
等函数,可以直接作用于 table
类型变量的列数据。这些函数返回一个包含各变量统计值的数组。
示例代码:
% 创建一个示例 table
data = table([10; 20; 30; 40], [15; 25; 35; 45], 'VariableNames', {'Var1', 'Var2'});
disp(data)
% 计算均值
mean_values = mean(data);
disp('均值:');
disp(mean_values)
% 计算方差
var_values = var(data);
disp('方差:');
disp(var_values)
% 计算标准差
std_values = std(data);
disp('标准差:');
disp(std_values)
代码逻辑分析:
- 第一行:使用
table
函数创建一个包含两列数据的table
,列名为Var1
和Var2
。 - 第四行:调用
mean
函数对整个表进行均值计算,结果是一个包含每列均值的表。 - 第七行:使用
var
函数计算每列的方差。 - 第十行:使用
std
函数计算每列的标准差。
输出结果:
Var1 Var2
____ ____
10 15
20 25
30 35
40 45
均值:
Var1 Var2
____ ____
25 30
方差:
Var1 Var2
____ ____
166.67 166.67
标准差:
Var1 Var2
____ ____
12.91 12.91
参数说明:
-
mean(table)
:默认计算每列的均值,适用于数值型列。 -
var(table)
:计算每列的样本方差(无偏估计)。 -
std(table)
:计算每列的标准差。
5.1.2 最大值、最小值与分位数统计
除了集中趋势和离散程度的统计,我们还需要了解数据的极值和分布情况。MATLAB 提供了 max
、 min
和 quantile
函数用于实现这些功能。
示例代码:
% 获取最大值
max_values = max(data);
disp('最大值:');
disp(max_values)
% 获取最小值
min_values = min(data);
disp('最小值:');
disp(min_values)
% 计算分位数(0.25, 0.5, 0.75)
quantile_values = quantile(data{:,:}, [0.25 0.5 0.75]);
disp('分位数:');
disp(quantile_values)
代码逻辑分析:
-
max(table)
:获取每列的最大值。 -
min(table)
:获取每列的最小值。 -
quantile(data{:,:}, [0.25 0.5 0.75])
:将table
数据转换为矩阵形式,计算 25%、50%、75% 分位数。
输出结果:
最大值:
Var1 Var2
____ ____
40 45
最小值:
Var1 Var2
____ ____
10 15
分位数:
15 20
25 30
35 40
表格:基础统计函数总结
函数名 | 功能说明 | 适用对象 |
---|---|---|
mean | 计算均值 | 数值型列 |
var | 计算样本方差 | 数值型列 |
std | 计算标准差 | 数值型列 |
max | 获取最大值 | 数值型列 |
min | 获取最小值 | 数值型列 |
quantile | 计算指定分位数 | 数值型列 |
5.2 分组统计与 groupsummary
函数
在工程和科研中,经常需要对数据按照某个或某些变量进行分组,然后在每个组内进行统计分析。MATLAB 提供了强大的 groupsummary
函数,能够高效地实现这一需求。
5.2.1 分组统计的基本原理
分组统计的核心思想是:根据一个或多个分类变量(grouping variables)将数据划分为若干组,然后在每组内应用统计函数(如 mean
、 sum
、 median
等)进行汇总。
分组统计流程图(mermaid 格式):
graph TD
A[原始 table 数据] --> B(选择分组变量)
B --> C{是否多分组?}
C -->|是| D[多变量组合分组]
C -->|否| E[单一变量分组]
D --> F[应用统计函数]
E --> F
F --> G[输出分组统计表]
5.2.2 groupsummary
函数的参数设置与使用示例
groupsummary
的基本语法如下:
G = groupsummary(T, groupvars, method, datavars)
-
T
:输入的table
。 -
groupvars
:分组变量名(字符串或元胞数组)。 -
method
:统计方法(如'mean'
,'sum'
,'median'
等)。 -
datavars
:需要统计的数据变量名。
示例代码:
% 创建带分组变量的 table
T = table({'A'; 'B'; 'A'; 'B'}, [10; 20; 30; 40], [15; 25; 35; 45], ...
'VariableNames', {'Group', 'Var1', 'Var2'});
disp(T)
% 按 Group 分组并计算 Var1 的均值
G1 = groupsummary(T, 'Group', 'mean', 'Var1');
disp('Group 分组下的 Var1 均值:');
disp(G1)
% 按 Group 分组并计算所有数值列的均值
G2 = groupsummary(T, 'Group', 'mean');
disp('Group 分组下的所有数值列均值:');
disp(G2)
代码逻辑分析:
- 第一行:创建一个包含分组变量
Group
和两个数值变量的table
。 - 第五行:使用
groupsummary
对Var1
列按Group
分组并计算均值。 - 第八行:对所有数值列按
Group
分组计算均值。
输出结果:
Group Var1 Var2
_____ ____ ____
A 10 15
B 20 25
A 30 35
B 40 45
Group 分组下的 Var1 均值:
Group GroupCount mean_Var1
_____ __________ _________
A 2 20
B 2 30
Group 分组下的所有数值列均值:
Group GroupCount mean_Var1 mean_Var2
_____ __________ _________ _________
A 2 20 25
B 2 30 35
参数说明:
-
groupsummary
支持多种统计方法,包括'mean'
,'sum'
,'median'
,'min'
,'max'
等。 -
GroupCount
显示每组的样本数。 -
datavars
可以指定为单个变量或多个变量(用元胞数组表示)。
表格: groupsummary
常见参数说明
参数名 | 说明 | 示例值 |
---|---|---|
T | 输入的 table | T |
groupvars | 分组变量名 | 'Group' 或 {'A','B'} |
method | 统计方法 | 'mean' , 'sum' |
datavars | 需要统计的数据列名 | 'Var1' 或 {'Var1','Var2'} |
5.3 分组分析的进阶实践
在实际工程中,数据往往更加复杂,需要进行多变量分组、多统计方法组合,甚至自定义统计函数。 groupsummary
提供了灵活的扩展能力,支持嵌入用户自定义函数进行统计。
5.3.1 多变量分组统计
多变量分组是指根据多个列的组合值进行分组。例如,我们可以按 Group
和 Category
两个变量进行分组统计。
示例代码:
% 创建带两个分组变量的 table
T = table({'A'; 'B'; 'A'; 'B'}, {'X'; 'X'; 'Y'; 'Y'}, [10; 20; 30; 40], ...
'VariableNames', {'Group', 'Category', 'Value'});
disp(T)
% 按 Group 和 Category 分组并计算均值
G = groupsummary(T, {'Group', 'Category'}, 'mean', 'Value');
disp('多变量分组统计结果:');
disp(G)
输出结果:
Group Category Value
_____ ________ _____
A X 10
B X 20
A Y 30
B Y 40
多变量分组统计结果:
Group Category GroupCount mean_Value
_____ ________ __________ __________
A X 1 10
A Y 1 30
B X 1 20
B Y 1 40
说明:
- 多变量分组可以更精细地划分数据,适合复杂的数据结构。
- 分组变量可为字符串、数值或分类变量。
5.3.2 自定义统计函数的嵌入使用
除了内置的统计方法, groupsummary
还支持传入自定义函数。例如,我们可以计算每组数据的变异系数(标准差除以均值)。
示例代码:
% 定义自定义函数:变异系数
coeff_var = @(x) std(x)/mean(x);
% 应用到 groupsummary
G = groupsummary(T, 'Group', coeff_var, 'Value');
disp('变异系数分组统计:');
disp(G)
输出结果:
Group GroupCount fun_Value
_____ __________ _________
A 2 0.70711
B 2 0.47140
说明:
- 自定义函数需接受一个向量并返回一个标量。
- 该函数将在每个分组的数据子集上执行。
- 可用于实现任意复杂的数据统计逻辑,如偏度、峰度、百分比变化等。
表格:分组统计方法对比
方法类型 | 内置函数支持 | 自定义函数支持 | 多变量分组支持 |
---|---|---|---|
均值 | ✅ | ✅ | ✅ |
方差 | ✅ | ✅ | ✅ |
标准差 | ✅ | ✅ | ✅ |
自定义函数 | ❌ | ✅ | ✅ |
通过本章内容,读者不仅掌握了 table
的基础统计分析技巧,还深入了解了分组统计的核心思想与 groupsummary
函数的高级用法。结合自定义函数的支持, table
成为了 MATLAB 数据分析中不可或缺的利器。下一章将继续深入探讨 table
在数据可视化与工程建模中的实际应用。
6. 模拟表的可视化与工程建模应用
6.1 基于table的可视化方法
MATLAB 的 table
数据类型在数据可视化方面具有天然的优势,它允许用户直接使用变量名进行绘图操作,从而避免了手动提取数据列的繁琐步骤。MATLAB 提供了一系列绘图函数,如 plot
、 bar
、 histogram
、 scatter
等,可以直接接受 table
类型的输入。
6.1.1 使用 plot、bar、histogram 绘制变量图表
下面以一个示例来展示如何使用 table
进行绘图:
% 创建一个包含温度、湿度和风速的table
time = datetime(2024,1,1,0,0,0) + hours(0:23)';
temperature = randi([10 30], 24, 1);
humidity = randi([40 80], 24, 1);
windSpeed = randi([0 15], 24, 1);
weatherData = table(time, temperature, humidity, windSpeed);
现在我们使用 plot
函数绘制温度随时间变化的曲线:
figure;
plot(weatherData.time, weatherData.temperature, 'b-o');
xlabel('时间');
ylabel('温度 (°C)');
title('24小时温度变化');
grid on;
参数说明 :
-weatherData.time
和weatherData.temperature
是从table
中直接提取的变量。
-'b-o'
表示蓝色实线并带有圆圈标记。
-grid on
用于显示网格线,增强图表可读性。
同样地,我们可以使用 bar
绘制湿度柱状图:
figure;
bar(weatherData.time, weatherData.humidity);
xlabel('时间');
ylabel('湿度 (%)');
title('24小时湿度变化');
6.1.2 绘图数据的自动提取与格式适配
MATLAB 的绘图函数支持直接通过变量名访问 table
中的数据,这极大简化了绘图流程。例如:
figure;
scatter(weatherData.temperature, weatherData.humidity, 'filled');
xlabel('温度 (°C)');
ylabel('湿度 (%)');
title('温度与湿度的相关性');
说明 :
- 上述代码中,scatter
函数直接从weatherData
表中提取temperature
和humidity
两列数据进行散点图绘制。
-'filled'
参数表示填充散点颜色。
6.2 模拟表在工程建模中的应用
table
在工程建模中常用于组织结构化数据,尤其适用于参数化建模、仿真配置、结果存储等场景。
6.2.1 模拟表在系统建模中的数据组织方式
在系统建模过程中,通常需要管理多个变量,如系统参数、初始条件、仿真配置等。使用 table
可以清晰地组织这些信息。
例如,建立一个简单的控制系统参数表:
controlParams = table(...
{'PID'; 'Lead-Lag'; 'On-Off'}, ... % 控制类型
[1.5; 2.0; 0], ... % 比例增益
[0.1; 0.05; 0], ... % 积分时间
[0.05; 0.02; 0], ... % 微分时间
'VariableNames', {'ControllerType', 'Kp', 'Ti', 'Td'});
输出 controlParams
表:
ControllerType | Kp | Ti | Td |
---|---|---|---|
PID | 1.5 | 0.10 | 0.05 |
Lead-Lag | 2.0 | 0.05 | 0.02 |
On-Off | 0.0 | 0.00 | 0.00 |
该表可用于后续仿真模型中参数的动态加载。
6.2.2 工程案例:基于 table 的参数化建模流程
以一个简单的弹簧-质量-阻尼系统建模为例,使用 table
来组织系统参数:
sysParams = table(...
[1; 2; 3], ... % 质量 (kg)
[0.5; 1.0; 1.5], ... % 阻尼系数 (Ns/m)
[100; 200; 300], ... % 弹簧刚度 (N/m)
'VariableNames', {'Mass', 'Damping', 'Stiffness'});
在 Simulink 模型中,可以使用 assignin
函数将表中的参数加载到工作区,实现参数化建模:
for i = 1:height(sysParams)
mass = sysParams.Mass(i);
damping = sysParams.Damping(i);
stiffness = sysParams.Stiffness(i);
assignin('base', 'mass', mass);
assignin('base', 'damping', damping);
assignin('base', 'stiffness', stiffness);
sim('spring_mass_damper_model'); % 假设模型已存在
end
说明 :
-assignin
函数将当前循环中的参数写入 MATLAB 基础工作区。
-sim
函数调用 Simulink 模型进行仿真。
6.3 数据的文件读写与格式转换
6.3.1 从CSV、Excel等外部文件导入 table
MATLAB 提供了 readtable
函数,可以方便地从 CSV、Excel 等文件中导入数据为 table
类型。
例如,从 CSV 文件读取:
dataTable = readtable('data.csv');
从 Excel 文件读取:
dataTable = readtable('data.xlsx', 'Sheet', 'Sheet1');
6.3.2 将 table 导出为结构化文件
使用 writetable
可以将 table
写入到 CSV 或 Excel 文件中:
writetable(dataTable, 'output.csv');
writetable(dataTable, 'output.xlsx');
6.3.3 table 与 array、cell、struct 的相互转换技巧
- table → array :使用
table2array
(适用于数值型变量)
dataArray = table2array(dataTable);
- table → cell :使用
table2cell
dataCell = table2cell(dataTable);
- table → struct :使用
table2struct
dataStruct = table2struct(dataTable, 'ToScalar', true);
- struct → table :使用
struct2table
dataTable = struct2table(dataStruct);
(本章节完)
简介:在MATLAB中识别和处理模拟表数据是数据分析和工程建模的重要基础。模拟表通常由实验、仿真或计算生成,MATLAB通过 table
数据类型提供了结构化存储和高效操作的方式。本文详细讲解了模拟表的创建、查看、操作、统计分析、可视化、格式转换及高级应用,涵盖 readtable
、 writetable
、 groupsummary
等关键函数,并指导读者掌握从数据导入到分析输出的完整流程,适用于信号处理、模型构建等多个工程领域。