2

我有两个时间序列:

dat = [0,2,3,0,2,2,0,0,1,0.8,3,4,6,7,4,4,3,0,1,3,2.2,0];
dat2 = dat+.5;
time = 1:length(dat);
plot(time,dat);
hold on;
plot(time,dat2,'r');

我想及时找到两个向量都具有大于一的最大连续值的区域。因此,对于这个特定示例,两个向量在 10 到 18 之间的值都大于 1。但是,在其他几个情况下,它们的值也大于 1。我可以通过首先生成一个矩阵来获得大于一的值的索引:

data = [dat',dat2'];

然后使用查找

r1 = data>1;

这将为我提供每个大于一的值的位置。接下来,我想找出在什么时间(在哪些行之间)保持最长持续时间的值 > 1。我怎样才能做到这一点?

4

2 回答 2

7

要查找最长运行值的索引,可以使用以下代码:

dat = [0,2,3,0,2,2,0,0,1,0.8,3,4,6,7,4,4,3,0,1,3,2.2,0];

id = find(dat>1);
x = [0 cumsum(diff(id)~=1)];

id(x==mode(x))

这导致

ans =

    11    12    13    14    15    16    17

此代码可与矩阵一起使用:

dat = [0,2,3,0,2,2,0,0,1,0.8,3,4,6,7,4,4,3,0,1,3,2.2,0];
dat2 = dat+.5;
data = [dat',dat2'];

id = find(all(data>1, 2));
x = [0; cumsum(diff(id(:))~=1)];

id(x==mode(x))

此代码给出了两列中大于 1 的最长运行值的索引:

ans =
    11
    12
    13
    14
    15
    16
    17
于 2012-12-07T14:27:42.067 回答
0

我不使用 matlab,但下面应该至少为您提供一个向量的最大范围。

rangeStart = 0;
rangeEnd = 0;
rangeLength = 0;
for i = 1:length(dat)
    for j = i+1:length(dat)
        % skip ranges smaller than the max
        if ((j-i)+1) <= rangeLength
            continue
        end
        % check to see if the range (i,j) meets the condition
        good = true;
        for x = i:j
            if dat(x) <= 1
                good = false;
            end
        end
        % the range meets the condition record the results
        if good
            rangeStart = i;
            rangeEnd = j;
            rangeLength = ((j-i)+1);
        end
    end
end

如果你想找到两个向量之间共享的最大范围,你会改变

            if dat(x) <= 1

            if dat(x) <= 1 || dat2(x) <= 1

除非上述任何语法错误都可以解决问题,否则可能会有一个更高级(阅读更有效)的 matlab 特定解决方案。

于 2012-12-07T14:29:48.910 回答