MATLAB中查找仅含单个零的行内该零的列索引
如何提取仅含单个零的行中零的列号
嘿,我明白你的困扰——你已经找到了那些只有一个零的行,但还需要对应列的位置对吧?其实有几种简单的方法可以实现,我给你梳理一下:
方法1:基于你现有代码的扩展
你已经用find(sum(~A,2) == 1)拿到了目标行号,接下来只需要对每一行单独查找零的位置就行。用arrayfun可以很方便地完成这个操作:
% 获取仅含单个零的行索引 target_rows = find(sum(~A, 2) == 1); % 对每个目标行,查找该行中零的列号 target_cols = arrayfun(@(r) find(~A(r, :)), target_rows);
这里arrayfun会遍历target_rows里的每一行,执行find(~A(r,:))——因为这些行只有一个零,所以返回的就是那个零的列号,结果target_cols和target_rows是一一对应的。
方法2:更高效的向量化操作(推荐)
如果你的矩阵特别大,向量化操作通常比循环/arrayfun更快。我们可以直接标记出所有符合条件的零的位置,一次性提取行列号:
% 生成标记所有零位置的逻辑矩阵 zero_mask = ~A; % 筛选出"所在行仅有一个零"的那些位置 single_zero_mask = zero_mask & (sum(zero_mask, 2) == 1); % 获取这些位置的行号和列号 [row_indices, col_indices] = find(single_zero_mask);
这样row_indices就是你原本找到的目标行号,col_indices就是对应的零的列号,两者顺序完全匹配。
方法3:一行式快速提取
如果你已经有了target_rows,也可以直接用索引提取子矩阵后找列号:
target_rows = find(sum(~A,2) == 1); target_cols = find(~A(target_rows, :));
因为~A(target_rows, :)是仅包含目标行的子矩阵,每行只有一个1(对应原矩阵的零),find会按列优先返回索引,但刚好每行一个结果,所以target_cols就是对应的列号,顺序和target_rows一致。
内容的提问来源于stack exchange,提问作者MaxFrost
相关产品推荐
相关产品推荐

