Skip to content

MATLAB - 均值函数

在 MATLAB 中,mean 函数是描述性统计的重要工具,它允许您快速计算数值数据的平均值(算术平均值)。无论您是汇总实验结果的数据科学家、分析传感器信号的工程师,还是跟踪股票表现的金融分析师,mean 都是数据分析的基石。

本教程将指导您了解其现代语法,并演示它在各种数据结构(包括向量、矩阵和表格)上的应用,重点关注处理缺失数据等实际场景。

mean 函数的语法灵活且功能强大:

M = mean(A) % 计算向量的平均值,或矩阵的按列平均值。
M = mean(A, 'all') % 计算数组 A 中所有元素的平均值。
M = mean(A, dim) % 沿着特定维度 `dim` 计算平均值。
M = mean(A, vecdim) % 计算向量 `vecdim` 中指定的维度上的平均值。
M = mean(___, nanflag) % 指定如何处理 NaN(非数值)值。
  • A:输入数据,可以是向量、矩阵或多维数组。它也可以是 table 或 timetable。
  • 'all':一个标志,用于计算 A 中所有元素的平均值,返回一个标量值。另一种方法是使用 mean(A(:))。
  • dim / vecdim:指定要操作的维度。对于二维矩阵,dim=1 计算每列的平均值,dim=2 计算每行的平均值。
  • nanflag:对于真实世界数据至关重要的选项。它可以设置为:
    • "omitnan":忽略计算中的 NaN 值(强烈推荐用于包含缺失条目的数据集)。
    • "includenan":包含 NaN 值,如果在计算切片中存在任何 NaN,则结果为 NaN(默认行为)。

让我们从一个简单的考试分数列表开始。

% 学生分数向量
scores = [85, 92, 78, 89, 95];
% 计算平均分数
average_score = mean(scores);
fprintf('平均分数是:%.2f\n', average_score);
% --- Output ---
% 平均分数是:87.80

对于矩阵,mean 默认独立地对每列进行操作。您必须指定维度以计算行平均值或总平均值。

% 学生分数矩阵(行代表学生,列代表作业)
studentScores = [90, 85, 75; % 学生 1
78, 92, 88; % 学生 2
81, 89, 94]; % 学生 3
% 每项作业的平均分数(每列的平均值,dim=1 是默认值)
meanPerAssignment = mean(studentScores, 1);
% 每位学生的平均分数(每行的平均值,dim=2)
meanPerStudent = mean(studentScores, 2);
% 班级总平均分(所有元素的平均值)
overallMean = mean(studentScores, 'all');
disp('每项作业的平均分数:');
disp(meanPerAssignment);
disp('每位学生的平均分数:');
disp(meanPerStudent);
fprintf('班级总平均分:%.2f\n', overallMean);
% --- Output ---
% 每项作业的平均分数:
% 83.0000 88.6667 85.6667
%
% 每位学生的平均分数:
% 83.3333
% 86.0000
% 88.0000
%
% 班级总平均分:86.00

实际数据通常混乱且包含缺失值,在 MATLAB 中表示为 NaN(非数值)。默认情况下,mean 函数遇到 NaN 时会返回 NaN。'omitnan' 标志是现代解决方案。

% 传感器读数,其中包含一个缺失值
sensorData = [22.5, 23.1, NaN, 22.8, 24.0];
% 默认行为(产生 NaN)
meanWithNaN = mean(sensorData);
% 处理缺失数据的正确方法
meanOmitNaN = mean(sensorData, 'omitnan');
fprintf('包含 NaN 时的平均值:%.2f\n', meanWithNaN);
fprintf('忽略 NaN 时的平均值:%.2f\n', meanOmitNaN);
% --- Output ---
% 包含 NaN 时的平均值:NaN
% 忽略 NaN 时的平均值: 23.10

在现代数据分析中,数据通常存储在 table 中。您可以直接将 mean 函数应用于表格变量。

% 创建一个包含产品销售数据的表格
products = {'A'; 'B'; 'C'; 'A'; 'B'};
unitsSold = [150; 220; 80; 180; NaN];
salesData = table(products, unitsSold);
disp('原始销售数据:');
disp(salesData);
% 计算 'unitsSold' 列的平均值,忽略缺失值
averageUnitsSold = mean(salesData.unitsSold, 'omitnan');
fprintf('\n平均销售数量:%.2f\n', averageUnitsSold);
% --- Output ---
% 原始销售数据:
% products unitsSold
% ________ _________
%
% {'A'} 150
% {'B'} 220
% {'C'} 80
% {'A'} 180
% {'B'} NaN
%
% 平均销售数量:157.50

如果您的 mean 计算意外地返回 NaN,几乎可以肯定您的输入数据包含一个或多个 NaN 值。使用 'omitnan' 标志来解决此问题。要定位 NaN 值以进行进一步检查,可以使用 isnan 函数:find(isnan(A))。