在matlab中查找行号

时间:2012-08-15 10:33:36

标签: matlab

来自以下示例:

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。我怎样才能做到这一点?

3 个答案:

答案 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);