我需要找到矩阵中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.
有关如何继续的任何建议将不胜感激。
答案 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