题目
编写程序,给定一个矩阵和设定阈值区间 $[L, U] = [0, 100]$,将矩阵中小于下界 $L$ 的元素全部限制为 $L$,将大于上界 $U$ 的元素全部限制为 $U$,中间保持不变。分别演示逻辑掩码法与双重 min/max 向量化法。
输入格式:无需外部输入。
输出格式:输出原始矩阵以及经两种方法限幅处理后的结果。
数据范围与约定:数值限幅处理。
思路与算法
1. 方法一:逻辑索引赋值
执行两步就地截断:M(M < L) = L; M(M > U) = U;,语义极其直白。
2. 方法二:min 与 max 嵌套M_clamped = min(max(M, L), U)。在 MATLAB/Octave 支持标量广播的机制下,max(M, L) 先把下界托底,外层 min(..., U) 再把上界封顶。此写法为纯函数式无副作用表达式,在流水线中很常见。
3. 工程信号限幅
在电机控制、PID 控制器输出饱和与图像像素截断中属于标准操作。
完整程序
% Octave / MATLAB 第40题:矩阵数值区间限幅 (Clamp)
M = [ -15, 45, 120;
80, -50, 100;
0, 105, 60];
L = 0; % 下界
U = 100; % 上界
% 方法 1:min-max 复合向量化法
M_clamp1 = min(max(M, L), U);
% 方法 2:逻辑索引条件替换法
M_clamp2 = M;
M_clamp2(M_clamp2 < L) = L;
M_clamp2(M_clamp2 > U) = U;
fprintf("原矩阵 M:\n");
disp(M);
fprintf("限幅到 [0, 100] (方法1 min-max):\n");
disp(M_clamp1);
fprintf("限幅到 [0, 100] (方法2 掩码赋值):\n");
disp(M_clamp2);运行示例
输出:
原矩阵 M:
-15 45 120
80 -50 100
0 105 60
限幅到 [0, 100] (方法1 min-max):
0 45 100
80 0 100
0 100 60
限幅到 [0, 100] (方法2 掩码赋值):
0 45 100
80 0 100
0 100 60