如何在列表中找到1的最长间隔[matlab]

时间:2014-11-27 00:07:58

标签: arrays matlab list matrix intervals

我需要找到矩阵中1的最长间隔,以及第一个" 1"的位置。在那段时间内。

For example if i have a matrix: [1 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1 ]

我需要长度为7,并且第一个1的位置是11.

有关如何继续的任何建议将不胜感激。

3 个答案:

答案 0 :(得分:1)

使用this anwser作为基础,您可以执行以下操作:

a = [1 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1 ]


dsig = diff([0 a 0]);
startIndex = find(dsig > 0);
endIndex = find(dsig < 0) - 1;
duration = endIndex-startIndex+1;
duration

startIdx = startIndex(duration == max(duration))
endIdx = endIndex(duration == max(duration))

输出:

duration =

     1     3     7


startIdx =

    11


endIdx =

    17

请注意,这可能需要仔细检查是否适用于除您的示例之外的其他情况。不过,我认为这是朝着正确方向发展的方向。如果没有,在链接的anwser中,您可以找到更多信息和可能性。

答案 1 :(得分:0)

如果有多个相同长度的间隔,它只会给出第一个间隔的位置。

A=round(rand(1,20)) %// test vector
[~,p2]=find(diff([0 A])==1); %// finds where a string of 1's starts
[~,p3]=find(diff([A 0])==-1); %// finds where a string of 1's ends
le=p3-p2+1; %// length of each interval of 1's
ML=max(le); %// length of longest interval
ML %// display ML
p2(le==ML) %// find where strings of maximum length begin (per Marcin's answer)

答案 2 :(得分:0)

我想到了一种蛮力的方法;

clc; clear all; close all;
A=  [1 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1 ];
index = 1;
globalCount = 0;
count = 0;
flag = 0; %// A flag to keep if the previous encounter was 0 or 1 
for i = 1 : length(A)
    if A(i) == 1
        count = count + 1;
        if flag == 0 
            index = i
            flag = 1;
        end

    end
    if A(i) == 0 || i == length(A)
        if count > globalCount
            globalCount = count;
        end
        flag = 0;
        count = 0;
    end

end