题目

编写程序,演示单文件多函数结构:主函数 <code>process_pipeline(x)</code> 对输入数据流做标准化处理,并在同一文件内调用两个私有子函数 <code>sub_clean(x)</code>(清除离群点)与 <code>sub_scale(x)</code>(缩放到 0~1 区间)。展示辅助逻辑的局部封装。

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

输出格式:输出原始数据、子函数过滤后数据、以及最终流水线缩放后的输出向量。

数据范围与约定:模块化组织。

思路与算法

1. 子函数可见性规则
在同一个 `.m` 文件中,排在第一个的函数为主函数(外部可调用),其后定义的所有函数均为子函数(Subfunctions,仅供当前文件内部互相调用,对外部工作区不可见)。

2. 高内聚低耦合
将脏数据清洗和数值归一化等辅助逻辑拆分为子函数,主函数仅负责调度编排,极大提升工程代码可维护性。

3. 命名空间保护
子函数不会污染外部工作区全局符号表。

完整程序

% Octave / MATLAB 第70题:主函数与私有子函数模式
1;

% 主流水线函数
function y = process_pipeline(raw_vec)
    fprintf("1. 接收原始数据流...\n");
    cleaned = sub_clean(raw_vec);
    
    fprintf("2. 离群点清洗完成,数据量从 %d 降为 %d\n", length(raw_vec), length(cleaned));
    y = sub_scale(cleaned);
    fprintf("3. 缩放至 [0, 1] 范围完成。\n");
end

% 局部辅助子函数 1:剔除负数脏数据
function out = sub_clean(v)
    out = v(v >= 0);
end

% 局部辅助子函数 2:Min-Max 缩放
function out = sub_scale(v)
    min_val = min(v);
    max_val = max(v);
    if abs(max_val - min_val) < 1e-12
        out = zeros(size(v));
    else
        out = (v - min_val) ./ (max_val - min_val);
    end
end

% 主程序执行
test_stream = [20, -5, 45, 12, -99, 80, 55];
res = process_pipeline(test_stream);

fprintf("\n原始数据: %s\n", mat2str(test_stream));
fprintf("最终输出: %s\n", mat2str(res, 3));

运行示例

输出:

1. 接收原始数据流...
2. 离群点清洗完成,数据量从 7 降为 5
3. 缩放至 [0, 1] 范围完成。

原始数据: [20 -5 45 12 -99 80 55]
最终输出: [0.118 0.485 0 1 0.632]