题目

编写程序,给定一个矩阵和设定阈值区间 $[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