有啥通用方法可以从矩阵中删除 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
一起使用:isnan
、nanmean
、max()
和 min()
还有一个 NaN 标志 ('omitnan'
),无论您想在最小值还是最大值中包含 NaN评估。
尽管您必须注意:有时NaNs
也可以由您的代码生成(例如,0/0 或在执行标准化时(x-mean(x))/std(x)
如果x
包含1 个值或多个但相等的值)。
【讨论】:
【参考方案3】:您无法避免NaN
,因为某些计算会产生它作为结果。例如,如果您计算1/0-1/0
,您将得到NaN
。你应该在代码级别处理NaN
s,使用像isnan
这样的内置函数。
【讨论】:
是否可以创建任何正则表达式来检测和删除非数字前缀和后缀? 我猜是这样,但它与NaN
s 无关——正则表达式对字符串进行操作,而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
用好JAVA中的函数式接口,轻松从通用代码框架中剥离掉业务定制逻辑