题目
编写程序,给定一个矩阵,查找其中所有等于指定目标值(或满足特定条件)的元素的行下标 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)