题目
编写程序,给定一个包含正负数的特征矩阵,使用逻辑索引将其中所有负数元素原地替换为 0(等价于深度学习中的 ReLU 激活函数),完全不使用循环。
输入格式:无需外部输入。
输出格式:输出替换前后的矩阵对比。
数据范围与约定:掩码条件赋值。
思路与算法
1. 条件原地赋值
语法为 A(condition) = value。例如 A(A < 0) = 0。MATLAB 内部会自动将右侧的标量 0 广播填充到掩码为 true 的所有内存槽位上。
2. 对比 max(A, 0)
ReLU 的另一种向量化写法是 max(A, 0),两者在数学上完全等价,均具备极高执行性能。
3. 保持原始矩阵维度
条件原地赋值不同于取值:原地赋值严格保持矩阵的原有行数与列数不变。
完整程序
% Octave / MATLAB 第35题:掩码条件替换负数归零
A = [ 1.5, -2.3, 0.0;
-0.8, 4.2, -5.1;
3.0, -1.2, 2.8];
fprintf("处理前矩阵 A:\n");
disp(A);
% 逻辑掩码原地赋值
A(A < 0) = 0;
fprintf("负数清零后 (ReLU 处理结果):\n");
disp(A);运行示例
输出:
处理前矩阵 A:
1.5000 -2.3000 0
-0.8000 4.2000 -5.1000
3.0000 -1.2000 2.8000
负数清零后 (ReLU 处理结果):
1.5000 0 0
0 4.2000 0
3.0000 0 2.8000