0

我有一个矩阵A:

南 南 南 南 南 南 南 南 10 1 8 7 2 5 6 2 3 49 南 南 南 南 南 南 南 南

我想知道是否有一种方法可以检测 NaN 何时首次变为数字并将第一个 2 点变为 NaN,例如将 10 和 1 都变为 NaN。

然后找到数字何时变为 NaN,并将最后两个数字点 3 和 49 变为 NaN。

最初我正在考虑使用以下方法,但我想知道这是否是最好的方法:

i= 2;
while i < 1440
    if isnan(A(i)) < isnan(A(i-1))     //Transitioning from NaN to numbers
        A(i:i+2) = NaN;
        i = i+ 4;
    elseif isnan(A(i)) > isnan(A(i-1))   //Transitioning from numbers to NaNs 
        A(i-2:i) = NaN;
        i = i + 1;
    else
        i = i + 1;
    end
end

但想知道是否还有其他方法可以优化它?

4

3 回答 3

3

首先,我假设您的向量 A 在开始和结束时由 NaN 组织,中间是一组连续的数字,如

A = [NaN ... NaN, contiguous numeric data, NaN ... NaN]

首先,我建议找到数字数据并从那里开始工作,例如,

flagNumeric = ~isnan(A);

现在flagNumeric对于数字条目将是true ,对于NaN's将是false

所以第一个数字将在

firstIndex = find(flagNumeric,1,'first');

最后一个数字在

 lastIndex = find(flagNumeric,1,'last');

然后,您可以使用firstIndexlastIndex将第一个和最后一个数字数据更改为 NaN

 A(firstIndex:firstIndex+1) = NaN;
 A(lastIndex-1:lastIndex) = NaN;
于 2011-12-06T22:42:39.333 回答
1
% Set the first two non-NaN numbers to NaN
first = find(isfinite(A), 1, 'first');
A(first:first+1) = NaN;

% Set the last two non-NaN numbers to NaN
last = find(isfinite(A), 1, 'last');
A(last-1:last) = NaN;

当然,上面的代码会在特殊情况下中断(例如 when last == 1),但这些应该很容易过滤掉。

于 2011-12-06T23:27:38.533 回答
1

这是一个稍微简单的版本,基于与 Azim 的回答相同的假设:

nums = find(~isnan(A));
A( nums([1 2 end-1 end]) ) = NaN;
于 2011-12-10T18:14:28.613 回答