题目

编写程序,已有两个数组,使用 <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