题目
编写程序,已有两个数组,使用 <code>all()</code> 判断是否所有元素均为正数,使用 <code>any()</code> 判断是否存在至少一个负数;并演示二维矩阵按列(默认)与全局降维检测。
输入格式:无需外部输入。
输出格式:输出向量与矩阵在 all 与 any 判定下的布尔结果。
数据范围与约定:布尔聚合判定。
思路与算法
1. any 与 all 概念any(v):向量中只要有至少 1 个非零(true)元素即返回 true;all(v):向量中所有元素都非零才返回 true。
2. 二维矩阵默认按列降维
对矩阵执行 any(M),默认按第 1 维(沿各列)操作,返回每一列是否存在真值的行向量!
3. 全局矩阵判定
若需判定整张矩阵是否全部满足条件,必须先展平 all(M(:) > 0),或者两次调用 all(all(M > 0))。这是初学者极常踩中的隐式降维陷阱。
完整程序
% Octave / MATLAB 第38题:all 与 any 降维机制
v1 = [1, 5, 8, 12];
v2 = [1, -3, 8, 12];
fprintf("v1 是否全为正数 (all(v1 > 0)): %d\n", all(v1 > 0));
fprintf("v2 是否全为正数 (all(v2 > 0)): %d\n", all(v2 > 0));
fprintf("v2 是否含有负数 (any(v2 < 0)): %d\n", any(v2 < 0));
% 矩阵按列与全局判定
M = [ 1, 2;
-1, 4];
fprintf("\n矩阵 M:\n");
disp(M);
fprintf("按列判定 any(M < 0) (返回各列结果): %s\n", mat2str(any(M < 0)));
fprintf("全局判定 any(M(:) < 0) (整张矩阵是否存在负数): %d\n", any(M(:) < 0));运行示例
输出:
v1 是否全为正数 (all(v1 > 0)): 1
v2 是否全为正数 (all(v2 > 0)): 0
v2 是否含有负数 (any(v2 < 0)): 1
矩阵 M:
1 2
-1 4
按列判定 any(M < 0) (返回各列结果): [true false]
全局判定 any(M(:) < 0) (整张矩阵是否存在负数): 1