MATLAB模拟表识别与数据处理实战

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:在MATLAB中识别和处理模拟表数据是数据分析和工程建模的重要基础。模拟表通常由实验、仿真或计算生成,MATLAB通过 table 数据类型提供了结构化存储和高效操作的方式。本文详细讲解了模拟表的创建、查看、操作、统计分析、可视化、格式转换及高级应用,涵盖 readtable writetable groupsummary 等关键函数,并指导读者掌握从数据导入到分析输出的完整流程,适用于信号处理、模型构建等多个工程领域。
matlab 识别模拟表

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);

(本章节完)

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:在MATLAB中识别和处理模拟表数据是数据分析和工程建模的重要基础。模拟表通常由实验、仿真或计算生成,MATLAB通过 table 数据类型提供了结构化存储和高效操作的方式。本文详细讲解了模拟表的创建、查看、操作、统计分析、可视化、格式转换及高级应用,涵盖 readtable writetable groupsummary 等关键函数,并指导读者掌握从数据导入到分析输出的完整流程,适用于信号处理、模型构建等多个工程领域。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值