1

次の例から:

x = 1 + (10-1)*rand(1,100);
x(12:22) = 20 + (30-20)*rand(1,11);
x(70:94) = 20 + (30-20)*rand(1,25);

ここで私はいくつかのことを試みています。最初に、20 を超える最初の値の行番号を見つけようとしています。ここで、20 を超える連続する値の数は 24 を超えています。したがって、この例では、行番号 70 を返したいと思います。

私はこれを行うことができます:

y = x > 20;
k = [strfind([~y(1),y],[0 1]);strfind([y,~y(end)],[1 0])];
idx = k(1,diff(k) + 1 > 24);

ただし、最初の値のセット (20 を超える連続する値が 24 個を超えていない) も nan に置き換えたいと思います。どうすればこれを達成できますか?

4

3 に答える 3

3

findの優れたソリューションが既にありますがidx、 find の方が適している可能性があります。わかりません:

y = x > 20;
kstart = find(diff([0 y])==1);
kend   = find(diff([y 0])==-1);
klen   = kend-kstart+1;

idx = kstart(find(klen>=24,1,'first')); %*

*はい、省略できることはわかっていますが'first'、わかりやすくするためにあります。


とにかく: 値の最初のセット ( を持っている人index<idx) を置き換えるには:

x(1:idx-1) = NaN;

または、以前に 20 より大きいすべての数値のみを置き換えるつもりだった場合idx:

x(y(1:idx-1)) = NaN;
于 2012-08-15T13:18:02.540 に答える
1

すでに良い解決策のセットが欲しいです。

畳み込みも使用できます。

tmp = conv(x>20, ones(1,25));
inds = find(tmp==25)
first_indes = inds(1);
于 2012-08-15T14:27:40.240 に答える
1

質問の最初の部分については、20 を超える要素が 25 回以上連続して出現するすべてのインデックスを見つけるためのワンライナーを次に示します。

idx = strfind((x(:)' > 20), ones(1, 25));

idx(1)この例では 70 である最初のインデックスを取得するために使用します。

あなたの質問の2番目の部分については、ここに解決策があります:

idx_start = strfind([0, x(:)'] > 20, [0 1]);           %# Start indices
len = strfind([x(:)' > 20, 0], [1 0]) - idx_start + 1; %# Sequence lengths
first = find(len < 25, 1);                             %# First desired sequence
x(idx_start(first):idx_start(first) + len(first) - 1) = NaN;

これは、24 以下である x > 20の最初の連続する発生のみを置き換えることに注意してください。

于 2012-08-15T13:25:58.933 に答える