题目

编写程序,给定一个矩阵,查找其中所有等于指定目标值(或满足特定条件)的元素的行下标 row、列下标 col 与对应数值 val。

输入格式:无需外部输入。

输出格式:依次打印找到的每个匹配项的行号、列号与数值。

数据范围与约定:位置检索。

思路与算法

1. 单输出与双输出模式
idx = find(A > 5) 只返回一维线性索引(基于列优先);而 [r, c] = find(A > 5) 将一维序号解耦为实际的行号与列号;[r, c, v] = find(A > 5) 还可以同时取回满足条件的元素值。

2. 行优先 vs 列优先顺序
find 扫描次序严格是第 1 列从上到下,接着第 2 列从上到下。

3. 稀疏矩阵联系
find 函数的三输出形式 [r, c, v] = find(A) 在稀疏矩阵坐标列表(COO 格式)构造中是绝对核心。

完整程序

% Octave / MATLAB 第36题:find 函数查找行列位置
M = [ 10,  45,  10;
      88,  10,  62;
      10,  73,  99];

target = 10;

% 检索所有等于 target 的位置
[rows, cols, vals] = find(M == target);

fprintf("矩阵 M:\n");
disp(M);
fprintf("找到数值等于 %d 的元素共有 %d 处:\n", target, length(rows));
for k = 1:length(rows)
    fprintf("  第 %d 处: 第 %d 行, 第 %d 列 (值为 %d)\n", k, rows(k), cols(k), M(rows(k), cols(k)));
end

运行示例

输出:

矩阵 M:
   10   45   10
   88   10   62
   10   73   99
找到数值等于 10 的元素共有 4 处:
  第 1 处: 第 1 行, 第 1 列 (值为 10)
  第 2 处: 第 3 行, 第 1 列 (值为 10)
  第 3 处: 第 2 行, 第 2 列 (值为 10)
  第 4 处: 第 1 行, 第 3 列 (值为 10)