有啥通用方法可以从矩阵中删除 NaN?

Posted

技术标签:

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

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

【问题讨论】:

您在寻找isnan吗? 【参考方案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;

【讨论】:

以上是关于有啥通用方法可以从矩阵中删除 NaN?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中处理接受 IComparable 的通用方法的 double.NaN

对二维矩阵进行排序的方法,我怎样才能使该方法通用?

从矩阵中删除 nan 元素

用好JAVA中的函数式接口,轻松从通用代码框架中剥离掉业务定制逻辑

有啥方法可以从 Windows 10 中的 c# 桌面应用程序使用蓝牙 LE?

在通用类的层次结构中使用访问者模式的最佳方法是啥?