【问题标题】:Matlab: find last non-NaN element and replace it with NaNMatlab:找到最后一个非NaN元素并将其替换为NaN
【发布时间】:2021-02-12 08:58:48
【问题描述】:

如何在 Matlab 中为矩阵的每一行找到最后一个非 NaN 元素的索引并将这些值替换为 NaN?

谢谢

【问题讨论】:

  • 如果x是你的矩阵,那么你可以用[~,ind]=max(isnan(x),[],2)得到索引

标签: matlab loops matrix nan


【解决方案1】:

这个方法可能是一个实现。它使用Logical_Array 表示NaN 值使用“1”,non-NaN 值使用“0”。然后使用find() 的每一行返回所有“0”/non-NaN 数字的索引。通过使用max() 评估最大索引,可以为每一行检索最后/最大列。取最大值可以适应NaN 值分散的场景。

Matrix = [1 2 NaN 4 5;
         1 NaN 3 NaN 5;
         1 2 NaN NaN NaN];
     
[Matrix_Height,~] = size(Matrix);

Logical_Array = isnan(Matrix);

for Row = 1: +1: Matrix_Height
    
    Target_Row = Logical_Array(Row,:);
    [Minimum,Indices] = find(Target_Row == 0);
    Last_Non_NaN_Index = max(Indices);
    Matrix(Row,Last_Non_NaN_Index) = NaN;
    
end

Matrix

测试矩阵结果:

第 1 行:5 → NaN
第 2 行:5 → NaN
第 3 行:2 → NaN

使用 MATLAB R2019b 运行

【讨论】:

    【解决方案2】:

    x 视为:

    x = [1   2   3   nan;
         3   4   nan nan;
         1   nan nan nan;
         nan nan nan nan]
    

    您可以通过以下方式获取每一行的第一个 nan 值的索引:

    [~,ind]=max(isnan(x),[],2);
    

    然后使用sub2ind

    x(sub2ind(size(x),max(ind.'-1,1),1:length(x))) = nan
    

    或单线:

    x((circshift(isnan(x),-1)+isnan(x))>0)=nan
    

    【讨论】:

      猜你喜欢
      • 2017-08-14
      • 2013-06-18
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 2018-07-19
      • 2012-06-13
      • 2013-09-25
      • 1970-01-01
      相关资源
      最近更新 更多