13

整数のリストをベクトルとして返すルーチンがあります。

これらの整数は、連番のグループから取得されます。たとえば、次のようになります。

vector = 6 7 8 12 13 14 15 26 27 28 29 30 55 56

上記の数字には 4 つの「連続」があることに注意してください (6 ~ 8、12 ~ 15、26 ~ 30、および 55 ~ 56)。私がやりたいのは、最も長い「ラン」の数値を新しいベクトルに転送することです。この場合、それは 26-30 回の実行になるので、次のように作成したいと思います。

newVector = 26 27 28 29 30

この計算は、さまざまなベクトルに対して何度も実行する必要があるため、より効率的に実行できるほど、より良い結果が得られます! どんな知恵もありがたく受け取るでしょう。

4

4 に答える 4

2

これがボールを転がすための解決策です。. .

vector = [6 7 8 12 13 14 15 26 27 28 29 30 55 56]
d = [diff(vector) 0]


maxSequence = 0;
maxSequenceIdx = 0;
lastIdx = 1;

while lastIdx~=find(d~=1, 1, 'last')

    idx = find(d~=1, 1);
    if idx-lastIdx > maxSequence
        maxSequence = idx-lastIdx;
        maxSequenceIdx = lastIdx;
    end

    d(idx) = 1;

    lastIdx=idx;
end

output = vector(1+maxSequenceIdx:maxSequenceIdx+maxSequence)

この例では、diff コマンドを使用して連続した数字を検索しています。数値が連続している場合、差は 1 です。その後、while ループを使用して、最も長い 1 のグループを見つけ、この連続したグループのインデックスを格納します。ただし、これはさらに最適化できると確信しています。

于 2012-07-11T13:35:33.550 に答える
1

ループなし - より速くなるはずです

temp = find ( ([(vector(2:end) - vector(1:end-1))==1 0])==0);
[len,ind]=max(temp(2:end)-temp(1:end-1));
vec_out =  vector(temp(ind)+1:temp(ind)+len)
于 2012-07-11T13:47:53.287 に答える