在边界的Matlab修剪

时间:2011-12-06 22:32:56

标签: matlab optimization data-manipulation

我有一个矩阵A:

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

我想知道是否有办法检测NaNs何时首先转向数字并将前2个点转为NaNs,例如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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

flagNumeric = ~isnan(A);

现在 flagNumeric 将是 true ,用于数字条目, false 用于 NaN的

所以第一个数字将在

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

的最后一个数字
 lastIndex = find(flagNumeric,1,'last');

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

 A(firstIndex:firstIndex+1) = NaN;
 A(lastIndex-1:lastIndex) = NaN;

答案 1 :(得分: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时),但这些代码应该可以直接过滤掉。

答案 2 :(得分:1)

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

nums = find(~isnan(A));
A( nums([1 2 end-1 end]) ) = NaN;