You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:43:14