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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:45:34