例で提供されているデータが variable にあると仮定すると、次のようにandx
を使用できます。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)