【问题标题】:how to replace consecutive nans elements with the row above如何用上面的行替换连续的nans元素
【发布时间】:2012-08-30 23:55:09
【问题描述】:

我有以下矩阵

A = [ 0    0  
      0    0 
      1   -1 
    NaN  NaN 
    NaN  NaN 
      0    0 
    NaN  NaN 
    NaN  NaN]

我想用上面的行替换所有NaN 行。对于上面的矩阵,这将是

A = [0  0 
     0  0 
     1  -1 
     1  -1 
     1  -1 
     0   0 
     0   0 
     0   0] 

【问题讨论】:

    标签: matlab


    【解决方案1】:

    一个想法是首先创建一个压缩矩阵B,它不包含NaN的行,然后再次扩展这个矩阵,使其与原始矩阵的长度相同:

    mask = any(isnan(A), 2);
    B = A(~mask, :);
    result = B(cumsum(~mask), :);
    

    【讨论】:

    • 多么好的解决方案! (编辑:但我刚刚注意到,如果 A 在第一行有 NaN,它就不起作用,对吧?不过它很好。)
    • @H.Muster:这是设计使然 :) OP 要求将 NaN 替换为 above 值,但第一行没有上述值。如果有人提供更清晰的规范,我会考虑如何解决。
    • +1:非常优雅! mask = isnan(A(:,1)) 怎么样?保存通过any...
    • @RodyOldenhuis:是的,好点子!只要整行包含 NaN 就可以工作。而且应该更快一点。
    【解决方案2】:

    我不确定这是否可以矢量化...更简单的解决方案可能是循环:

    newRow = [];
    nans = isnan(A(:,1));
    for ii = 1:size(A,1)
    
        if nans(ii)
    
            %# first row might be NaN -- skip it
            if ii==1
                continue; end
    
            %# for all other rows:
            if isempty(newRow) 
                newRow = A(ii-1,:); end
    
            A(ii,:) = newRow;
    
        else
            newRow = [];
        end
    
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多