MATLAB中如何统计逻辑向量内连续1的块数?尝试用元胞数组
统计MATLAB逻辑向量中连续1的块数
你的嵌套循环逻辑存在问题:两层循环重复遍历数组,且没有正确捕捉“从0切换到1”这个连续1块的起始信号,因此无法实现统计块数的需求。以下是两种可行的解决方案,其中矢量化方法更适合处理超大维度的数组(比如3820000元素):
方法一:矢量化实现(高效,推荐用于大数组)
利用差分运算检测数组中元素从0到1的切换,这类切换的次数就是连续1块的数量,同时需要考虑数组第一个元素就是1的特殊情况:
idx1 = [0 0 0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0]; % 生成带前置0的差分信号,对齐原数组长度 diff_idx = [0, diff(idx1)]; % 统计从0到1的切换次数,加上开头就是1的情况 block_count = sum(diff_idx == 1) + idx1(1); disp(block_count); % 示例输出:4
原理:diff(idx1)计算相邻元素的差值,当元素从0变为1时差值为1,从1变为0时差值为-1,其余情况为0。前置0是为了兼容数组开头就是1的场景,此时idx1(1)为1,会额外加1块计数。
方法二:循环实现(逻辑直观)
仅需一次遍历数组,通过对比当前元素与前一个元素的值,判断是否开启新的连续1块:
idx1 = [0 0 0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0]; block_count = 0; prev_val = 0; % 初始假设前一个元素为0 for i = 1:length(idx1) % 当当前元素是1且前一个是0时,新块开始 if idx1(i) == 1 && prev_val == 0 block_count = block_count + 1; end prev_val = idx1(i); % 更新前一个元素的记录 end disp(block_count); % 示例输出:4
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

