【问题标题】:MATLAB: binary array count of groups longer than NMATLAB:组的二进制数组计数长于 N
【发布时间】:2017-09-28 13:58:33
【问题描述】:

我有一个二进制数组,表示视频中各个帧的对象检测。我试图从这个向量中确定有多少单独的事件。我需要找出一种方法来计算二进制数组中 1 的簇数。

使用 Matlab 函数确定有多少个连续 1 的单独组大于 N=5 的最简单方法是什么?

例如对于数组: 1 1 0 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 我希望输出为 2,因为有 2 组 1 比 N 长。

我需要一种有效的方法来执行此操作,而不仅仅是循环播放,因为我必须在大约 20,000 个短视频上运行它。有点希望有一个我错过的用于此目的的内置函数,但欢迎任何解决方案。

我试图加速的这段代码的丑陋版本如下所示:

    % Count Events
    EventCount = 0;
    subcount = 0;
    N = 5;
    for e=1:length(events) % events is a binary array
        if (events(e) == 1) && (subcount == 0)
            subcount = 1;
        elseif events(e) == 1 
            subcount = subcount + 1;
        elseif (events(e) == 0) && (subcount > N)
            EventCount = EventCount + 1;
            subcount = 0;
        elseif (events(e) == 0) && (subcount <= N)
            subcount = 0;
        else
            disp('Oops, should not get here!');                  
        end
    end
    disp(EventCount);

【问题讨论】:

    标签: arrays algorithm matlab binary grouping


    【解决方案1】:

    单线性解:

    sum(accumarray(1+cumsum([0 diff( events)==1].'),events.')>N)
    

    计算1s块的起始索引:

    idx = diff(events.')==1;
    

    为每个组分配一个类别编号:

    catnum=1+cumsum([0 idx].');
    

    计算每个类别中 1 的个数

    count = accumarray(catnum,events);
    

    计算有多少组 1 比 N 长

    sum(count>N)
    

    【讨论】:

    • 我收到Error using accumarray First input SUBS must contain positive integer subscripts. 正在尝试调试,但对 accumarray 函数的末尾如何工作有点困惑。例如,正在测试它的 events 数组长度为 600,中间有一个 20 个 1 的字符串,其余的是 0,所以我希望输出为 1
    • @Jake 我可以用八度测试它,没有问题。请尝试rextester
    猜你喜欢
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2018-12-05
    • 2021-12-14
    • 2014-04-23
    相关资源
    最近更新 更多