【问题标题】:Dealing with NaN's in matlab functions在 matlab 函数中处理 NaN
【发布时间】:2013-01-19 13:17:21
【问题描述】:

我想知道 matlab 是否有内置方法来处理函数调用中的NaN。更具体地说,我试图取其中包含 NaN 的向量的平均值。例如,在 R

> x = c(1,2,3,4,NA)
> mean(x)
[1] NA
> mean(x,na.rm=TRUE)
[1] 2.5

在 Matlab 中是否有与此类似的东西在一行中(我不想编写自己的函数,也不想在计算平均值之前循环查找 NaN's)。

另外,我无权访问统计工具箱,因此无法使用 nanmean() 之类的东西。

【问题讨论】:

    标签: r matlab function matrix nan


    【解决方案1】:

    您可以执行mean(x(~isnan(x))) 之类的操作。如果你愿意,你也可以像这样编写一堆包装器并将它们放在你的 startup.m 文件中。

    【讨论】:

      【解决方案2】:

      截至 MATLAB 2015a,mean supports an extra parameter, nanflag。使用 JoErNanO 的答案中的示例,

      A = [1 0 NaN; 0 3 4; 0 NaN 2];
      mean(A, 'omitnan')
      % = [0.333333333333333 1.5 3]
      

      该参数的默认值为includenan,它将为包含NaNs 的列/行返回NaN

      mediancovminmaxsumvarstd也支持忽略NaNs。

      【讨论】:

        【解决方案3】:

        我认为这应该可行:

        mean(x(isfinite(x)));
        

        【讨论】:

          【解决方案4】:

          矩阵呢?

          正如 Karthik V 所建议的,

          mean(x(~isnan(x)))
          

          适用于向量。但是,如果您有一个 n×m 矩阵并希望计算行/列平均丢弃偶尔的 NaN,则必须运行 for 循环。

          示例场景

          想象一个表格的数据矩阵:

          A = [1 0 NaN; 0 3 4; 0 NaN 2]
          
          A =
           1     0   NaN
           0     3     4
           0   NaN     2
          

          运行mean(A(~isnan(A))) 产生:

          ans =
          
          1.4286
          

          这是因为逻辑索引有效地将矩阵“展平”为向量。

          循环解(按列均值)

          假设您要计算列均值,则循环解决方案变为:

          % Preallocate resulting mean vector
          nCols = size(A, 2);
          mu = zeros(1, nCols);
          
          % Compute means
          for col = 1:nCols
              mu(col) = mean(A(~isnan(A(:, col)), col));
          end
          

          导致:

          mu =
          
          0.3333    1.5000    3.0000
          

          循环解(行均值)

          假设您要计算逐行均值,则循环解决方案变为:

          % Preallocate resulting mean vector
          nRows = size(A, 1);
          mu = zeros(nRows, 1);
          
          % Compute means
          for row = 1:nRows
              mu(row) = mean(A(row, ~isnan(A(row, :))));
          end
          

          导致:

          mu =
          
          0.5000
          2.3333
          1.0000
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-12-10
            • 2014-08-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多