题目
给定分段函数:\n当 $x < 0$ 时,$y = x^2$;\n当 $0 \le x < 5$ 时,$y = 2x + 1$;\n当 $x \ge 5$ 时,$y = 3x - 4$。\n分别演示针对单点的标量 <code>if-elseif</code> 解法,以及针对一整组采样向量的逻辑索引向量化解法。
输入格式:无需外部输入。
输出格式:输出单点测试结果与向量批量映射结果。
数据范围与约定:分段函数计算。
思路与算法
1. 标量与向量的分野
初学者常误将数组直接丢进 if x < 0,这只会判断首个元素。处理数组必须使用向量化写法。
2. 向量化分段赋值
先预分配全零数组 y = zeros(size(x)),然后按分段区间构造掩码分步赋值:\nm1 = (x < 0); y(m1) = x(m1).^2;\nm2 = (x >= 0 & x < 5); y(m2) = 2*x(m2) + 1;\nm3 = (x >= 5); y(m3) = 3*x(m3) - 4;。
3. 运算性能
向量化赋值彻底消除了脚本级循环,在百万级采样点时性能差距达到上百倍。
完整程序
% Octave / MATLAB 第47题:分段函数求值
% 1. 标量测试
x_single = 3.5;
if x_single < 0
y_single = x_single^2;
elseif x_single < 5
y_single = 2 * x_single + 1;
else
y_single = 3 * x_single - 4;
end
fprintf("标量点 x = %.2f 的函数值: %.2f\n", x_single, y_single);
% 2. 向量化批量映射
x_vec = [-2, -1, 0, 2, 4, 5, 8];
y_vec = zeros(size(x_vec));
% 掩码切片分别计算
m1 = (x_vec < 0);
y_vec(m1) = x_vec(m1) .^ 2;
m2 = (x_vec >= 0) & (x_vec < 5);
y_vec(m2) = 2 * x_vec(m2) + 1;
m3 = (x_vec >= 5);
y_vec(m3) = 3 * x_vec(m3) - 4;
fprintf("\n输入向量 x: %s\n", mat2str(x_vec));
fprintf("分段映射 y: %s\n", mat2str(y_vec));运行示例
输出:
标量点 x = 3.50 的函数值: 8.00
输入向量 x: [-2 -1 0 2 4 5 8]
分段映射 y: [4 1 1 5 9 11 20]