0

我在向量中有一组数据点。例如,

   [NaN, NaN, NaN, -1.5363, NaN -1.7664, -1.7475];

这些数据来自在指定范围内选择 3 个点的代码(特别是 -0.6 和 0.6)。如果该范围内不存在该列中的三个点,则该范围将递增扩展,直到找到三个点。在上面的示例中,范围增加到 -1.8 到 1.8。然而,我们正在分析的数据是不稳定的,并且具有随机的波峰和波谷,导致不连续的点被接受到范围内(元素 3 被选择为有效,但元素 4 不被接受)。

解决此问题的最佳方法是什么?我已经有一个代码来逐步增加范围以找到三个点,我只需将其修改为不在任何三个点处停止,而是增加范围直到找到三个连续点。如果对上面的例子这样做,我只会评估斜率以删除第三个元素(因为在 3 和 4 之间,斜率是负数)。

谢谢。

4

1 回答 1

0

假设您在示例中提供的数据在变量中,x您可以像这样使用:isnanfindstr

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]在返回的逻辑数组中找到序列isnanfindstr并将返回输入数组中该序列出现的位置的索引。

对于您的示例数据,这将返回[],但如果您将其更改为我给出的示例中的数据,它将返回 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)
于 2013-04-01T22:09:48.520 回答