【问题标题】:Matlab Trimming at BoundsMatlab 边界修整
【发布时间】:2011-12-06 22:32:56
【问题描述】:

我有一个矩阵 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 何时首次转为数字并将第一个 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

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

【问题讨论】:

    标签: matlab optimization data-manipulation


    【解决方案1】:

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

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

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

    flagNumeric = ~isnan(A);
    

    现在 flagNumeric 将是 true 对于数字条目和 false 对于 NaN's。 p>

    所以第一个数字将在

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

    最后一个数字在

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

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

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

    【讨论】:

      【解决方案2】:
      % 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),但这些应该很容易过滤掉。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-19
          • 2018-05-05
          • 2013-01-05
          • 2023-03-07
          • 2015-12-27
          • 2013-07-15
          相关资源
          最近更新 更多