【问题标题】:MATLAB remove NaN values from matrix and shift values leftMATLAB 从矩阵中删除 NaN 值并将值左移
【发布时间】:2013-04-01 23:45:30
【问题描述】:

我正在尝试计算以下矩阵中的列差异:

A = 
     0       NaN       NaN    0.3750       NaN
     NaN    0.1250    0.2500  0.3750       NaN

我想获得:

0.3750 NaN    NaN
0.1250 0.1250 0.1250

我实际上是在取列差异,跳过 NaN 值并将值向左移动。

一维情况是:

A = [0 NaN 0.250 0.375 NaN 0.625];
NaN_diff(A) = [0.250 0.125 0.250];

有什么方法可以在 MATLAB 中有效地做到这一点,而无需每行使用低效的 find() 查询?

【问题讨论】:

  • 这不清楚,如果您“跳过 NaN”,那么为什么您的示例输出中仍然存在 NaN?
  • 抱歉,我添加了这些 NaN 以确保矩阵是矩形的 - 具有更多数字的行将具有更长的差异。它们可以任意为零。

标签: matlab


【解决方案1】:

这是一个矢量化大部分操作的解决方案:

notNan = ~isnan(A);
numNN  = sum(notNan,2);

shifted = NaN(size(A));

for r = 1:size(A,1)
   myRow = A(r,:);
   shifted(r,1:numNN(r)) = myRow(notNan(r,:));
end

nanDiff = diff(shifted,1,2);

【讨论】:

  • 我收到了 Subscripted assignment dimension mismatch 错误。也许你的意思是 1:numNN(r) 在 for 循环中?
【解决方案2】:

这里是另一种矢量化解决方案:

%// Convert to cell array without NaNs
[rows, cols] = size(A);
C = cellfun(@(x)x(~isnan(x)), mat2cell(A, ones(1, rows), cols), 'Uniform', 0);

%// Compute diff for each row and pad
N = max(sum(~isnan(A), 2));
C = cellfun(@(x)[diff(x) nan(1, N - length(x))], C, 'Uniform', 0);

%// Convert back to a matrix
nandiff = vertcat(C{:});

如果您想用零而不是NaN 值填充结果矩阵,请将nan(1, N - length(x)) 中的nan 函数调用更改为zeros

【讨论】:

    【解决方案3】:

    这是一种替代方法,它确实需要您循环遍历每一行,但仍应具有不错的性能并且对我来说感觉非常直观。

    B = NaN(size(A,1),size(A,2)-1)
    
    for i = 1:size(A,1)
       idx = ~isnan(A(:,i))
       B(i,1:sum(idx)) = diff(A(i,idx))
    end
    

    【讨论】:

      【解决方案4】:

      我知道这是一个相当古老的问题,但对于像我这样偶然进入此页面的人来说,这里有一个更简单(恕我直言)的问题解决方案:

      A = [0 NaN 0.250 0.375 NaN 0.625];
      A(isnan(A))=[]; % identify index of NaN values and remove them from the array
      B = diff(A); 
      

      【讨论】:

        【解决方案5】:

        这是另一个不使用循环的简单解决方案[但假设所有值都按升序排列]:

        A=[0       NaN       NaN    0.3750       NaN;NaN    0.1250    0.2500  0.3750       NaN]
        A(isnan(A(:,1)))=0;
        B=sort(A,2);
        C=diff(B,1,2)
        

        【讨论】:

          猜你喜欢
          • 2012-06-17
          • 2014-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-21
          • 2012-02-13
          • 2021-08-23
          相关资源
          最近更新 更多