如何在MATLAB中查找二值矩阵每行的首个和末尾1的列号
解决二值矩阵每行首尾1的列号提取问题
嘿,刚好之前处理过类似的需求,给你两种实用的Matlab实现方法,都能完美得到你要的结果:
方法一:通用型(适合包含全0行的场景)
这种方法用arrayfun结合find函数,能精准定位每行第一个和最后一个1的位置,就算某行全是0也能返回空值方便后续处理:
% 定义你的二值矩阵 bw = [0 0 1 1 1 0; 1 1 1 1 1 0; 0 1 1 1 0 0; 0 0 0 1 1 1]; % 提取每行首次出现1的列号 first = arrayfun(@(row_idx) find(bw(row_idx,:) == 1, 1, 'first'), 1:size(bw,1)); % 提取每行最后出现1的列号 last = arrayfun(@(row_idx) find(bw(row_idx,:) == 1, 1, 'last'), 1:size(bw,1));
运行后输出:
first = [3 1 2 4] last = [5 5 4 6]
代码解释:
size(bw,1)获取矩阵的行数,1:size(bw,1)遍历每一行的索引find(bw(row_idx,:) == 1, 1, 'first')表示在第row_idx行中,找到第一个等于1的元素的列号,第二个参数1表示只返回第一个匹配项arrayfun把这个逻辑批量应用到每一行,直接生成结果向量
方法二:高效简洁型(仅适用于每行至少有一个1的场景)
如果你的矩阵每行肯定都有1,用max函数会更简洁高效:
bw = [0 0 1 1 1 0; 1 1 1 1 1 0; 0 1 1 1 0 0; 0 0 0 1 1 1]; % 提取首次出现1的列号:max返回每行最大值(1)的第一个位置 [~, first] = max(bw, [], 2); % 提取最后出现1的列号:先把每行反转,找第一个1的位置,再转换为原列号 [~, reversed_last] = max(fliplr(bw), [], 2); last = size(bw,2) - reversed_last + 1;
这个方法利用了max函数在遇到多个相同最大值时,返回第一个出现位置的特性。对于最后一个1的位置,我们先把每行反转,找到反转后的第一个1的位置,再通过列数换算回原矩阵的列号。
两种方法都能得到你预期的结果,根据你的实际场景选就行~
内容的提问来源于stack exchange,提问作者sn17
相关产品推荐
相关产品推荐

