2

私は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');

両方のベクトルが 1 より大きい連続する値の最大数を持つ時間領域を見つけたいと思います。したがって、この特定の例では、両方のベクトルが 10 から 18 の間で 1 より大きい値を持ちます。ただし、他のいくつかの場合でも 1 より大きい値を持ちます。最初に行列を生成することで、1 より大きい値のインデックスを取得できます。

data = [dat',dat2'];

そして、検索を使用して

r1 = data>1;

これにより、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を使用していませんが、以下は少なくとも1つのベクトルの最大範囲を取得する必要があります.

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 に答える