假设您在示例中提供的数据在变量中,x
您可以像这样使用:isnan
findstr
x = [NaN, NaN, NaN, -1.5363, NaN -1.7664, -1.7475, 123];
~isnan(x)
ans =
0 0 0 1 0 1 1 1
pos = findstr(~isnan(x), [1 1 1]);
像这样使用的原因findstr
是我们想[1 1 1]
在返回的逻辑数组中找到序列isnan
,findstr
并将返回输入数组中该序列出现的位置的索引。
对于您的示例数据,这将返回[]
,但如果您将其更改为我给出的示例中的数据,它将返回 6,您可以使用 提取连续区域x(pos:pos+2)
。[6 7]
对于超过 3 个连续值的情况(如果有 4 个,它将返回)以及有多个连续区域的情况,您必须小心。如果您不需要对这些情况做任何有意义的事情,那么只需使用 pos(1)。
如果要提取长度大于或等于 3 的第一个连续区域的整体,可以执行以下操作:
x = [NaN, NaN, NaN, -1.5363, NaN -1.7664, -1.7475, 123, 456, 789];
startPos = [];
stopPos = [];
pos = findstr(~isnan(x), [1 1 1]);
if ~isempty(pos)
startPos = pos(1);
stopPos = startPos + 2;
% Find any cases where we have consecutive numbers in pos
if length(pos) > 1 && any(diff(pos) == 1)
% We have a contiguous section longer than 3 elements
% Find the NaNs
nans = find(isnan(x));
% Find the first NaN after pos(1), or the index of the last element
stopPos = nans(nans > startPos);
if ~isempty(stopPos)
stopPos = stopPos(1) - 1; % Don't want the NaN
else
stopPos = length(x);
end
end
end
x(startPos:stopPos)