【问题标题】:Is there any general way to remove NaNs from a matrix?有什么通用方法可以从矩阵中删除 NaN?
【发布时间】:2016-05-22 04:46:40
【问题描述】:

有什么通用的方法可以从矩阵中删除 NaN?有时我在一些代码中间遇到这个问题,然后它会产生问题以获得适当的输出。有没有办法生成任何类型的检查以避免 MATLAB 代码中出现 NaN?如果有人可以给我一个与之相关的想法的例子,那将非常有帮助。

【问题讨论】:

  • 您在寻找isnan吗?

标签: matlab matrix nan


【解决方案1】:

您可以使用isnan 函数检测 nan 值:

A = [1 NaN 3];
A(~isnan(A))
     1  3

这实际上删除了 nan 值,但这并不总是可能的,例如

A = [1 nan; 2 3];
A(~isnan(A))

     1
     2
     3

如您所见,这会破坏矩阵结构。您可以通过先预分配来避免这种情况,从而将 nan 值设置为零:

B = zeros(size(A));
B(~isnan(A))=A(~isnan(A))

B =

     1     0
     2     3

或者,覆盖我们原来的矩阵A

A(isnan(A))=0
A =
     1     0
     2     3

【讨论】:

    【解决方案2】:

    有几个函数可以与 NaNs 一起使用:isnannanmeanmax()min() 还有一个 NaN 标志 ('omitnan'),无论您想在最小值还是最大值中包含 NaN评估。

    尽管您必须注意:有时NaNs 也可以由您的代码生成(例如,0/0 或在执行标准化时(x-mean(x))/std(x) 如果x 包含1 个值或多个但相等的值)。

    【讨论】:

      【解决方案3】:

      您无法避免NaN,因为某些计算会产生它作为结果。例如,如果您计算1/0-1/0,您将得到NaN。你应该在代码级别处理NaNs,使用像isnan这样的内置函数。

      【讨论】:

      • 是否可以创建任何正则表达式来检测和删除非数字前缀和后缀?
      • 我猜是这样,但它与NaNs 无关——正则表达式对字符串进行操作,而NaN 不是字符串
      【解决方案4】:

      几种情况会产生一个包含 NaN 值的矩阵A

      (1) 构造一个新矩阵,其中所有带有 NaN 的行都被删除。

      row_mask = ~any(isnan(A),2);
      A_nonans = A(row_mask,:);
      

      (2) 构造一个新矩阵,其中所有带有 NaN 的列都被删除。

      column_mask = ~any(isnan(A),1);
      A_nonans = A(:, column_mask);
      

      (3) 构造一个新矩阵,其中所有 NaN 项都替换为 0。

      A_nans_replaced = A;
      A_nans_replaced(isnan(A_nans_replaced)) = 0;
      

      【讨论】:

        【解决方案5】:

        简单:

        A=[1 2; nan 4];
        A(isnan(A))=0;
        

        【讨论】:

          猜你喜欢
          • 2012-06-17
          • 2021-10-30
          • 2014-09-21
          • 2012-02-13
          • 2013-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多