0

私は行列Aを持っています:

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

NaN が最初に数字に変わるタイミングを検出し、10 と 1 の両方を NaN にするなど、最初の 2 ポイントを NaN に変える方法があるかどうか疑問に思っていました。

次に、数値が NaN になるタイミングを見つけ、最後の 2 つの数値ポイント 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のエントリでは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

これは、Azimの答えと同じ仮定に基づいた、少し単純なバージョンです:

nums = find(~isnan(A));
A( nums([1 2 end-1 end]) ) = NaN;
于 2011-12-10T18:14:28.613 に答える
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;

もちろん、上記のコードは特殊なケース (例: の場合last == 1) で壊れますが、これらは簡単に除外できます。

于 2011-12-06T23:27:38.533 に答える