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

但是,我还想将第一组值(不包括超过 24 个 > 20 的连续值)替换为 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

至于你的问题的第一部分,这里有一个单行代码,用于查找大于 20 的 25 个或更多连续出现的元素的所有索引:

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 > 20 的第一次连续出现,不超过 24。

于 2012-08-15T13:25:58.933 回答
1

我想要一套已经很好的解决方案。

您也可以使用卷积:

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