题目

编写程序,给定一个因传感器异常或除零而混入 <code>NaN</code>(Not-a-Number)和 <code>Inf</code>(无穷大)的污染数据向量,检测异常点并利用逻辑索引剔除所有脏数据,计算干净数据的均值。

输入格式:无需外部输入。

输出格式:展示原始受污染数据、脏数据逻辑掩码、清洗后的纯净数据及其均值。

数据范围与约定:异常值过滤清洗。

思路与算法

1. NaN 无法用等号比较
IEEE 754 浮点标准规定 NaN == NaN 恒为 false!因此绝对不能用 v == NaN 匹配空值,必须使用专用函数 isnan(v)。

2. Inf 的检测
使用 isinf(v) 匹配正无穷 +Inf 与负无穷 -Inf;或者使用 isfinite(v) 一键匹配既非 NaN 也非 Inf 的所有正常有限实数。

3. 数据清洗规范
纯净数据标准提取写法:clean_data = data(isfinite(data))。

完整程序

% Octave / MATLAB 第39题:过滤 NaN 与 Inf
raw_data = [10.5, NaN, 20.2, Inf, 30.8, -Inf, 40.1];

% 1. 检测 NaN 与 Inf
mask_nan = isnan(raw_data);
mask_inf = isinf(raw_data);

% 2. 构造有效有限数掩码 isfinite
mask_valid = isfinite(raw_data);

% 3. 提取干净数据
clean_data = raw_data(mask_valid);
avg_val = mean(clean_data);

fprintf("原始数据: %s\n", mat2str(raw_data));
fprintf("NaN 个数: %d\n", sum(mask_nan));
fprintf("Inf 个数: %d\n", sum(mask_inf));
fprintf("清洗后数据 (isfinite): %s\n", mat2str(clean_data));
fprintf("纯净数据均值 mean: %.2f\n", avg_val);

运行示例

输出:

原始数据: [10.5 NaN 20.2 Inf 30.8 -Inf 40.1]
NaN 个数: 1
Inf 个数: 2
清洗后数据 (isfinite): [10.5 20.2 30.8 40.1]
纯净数据均值 mean: 25.40