来自以下示例:
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);
但是,我还想将第一组值(不包括超过24个连续值> 20)替换为nan。我怎样才能做到这一点?
答案 0 :(得分:3)
你已经有了一个很好的解决方案来找到idx
,也许找到更合适的,我不知道:
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;
或者,如果您只想在idx
之前替换所有大于20的数字:
x(y(1:idx-1)) = NaN;
答案 1 :(得分:1)
至于你问题的第一部分,这里是一个单行程,用于查找 all 25个或更多连续出现的大于20的元素的索引:
idx = strfind((x(:)' > 20), ones(1, 25));
使用idx(1)
获取第一个索引,在您的示例中为70。
关于问题的第二部分,这是一个解决方案:
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;
请注意,这仅替换第一次连续出现的x&gt; 20,不超过24。
答案 2 :(得分:1)
我想要一套已经很好的解决方案。
您也可以使用卷积:
tmp = conv(x>20, ones(1,25));
inds = find(tmp==25)
first_indes = inds(1);