【发布时间】:2016-05-22 04:46:40
【问题描述】:
有什么通用的方法可以从矩阵中删除 NaN?有时我在一些代码中间遇到这个问题,然后它会产生问题以获得适当的输出。有没有办法生成任何类型的检查以避免 MATLAB 代码中出现 NaN?如果有人可以给我一个与之相关的想法的例子,那将非常有帮助。
【问题讨论】:
-
您在寻找
isnan吗?
有什么通用的方法可以从矩阵中删除 NaN?有时我在一些代码中间遇到这个问题,然后它会产生问题以获得适当的输出。有没有办法生成任何类型的检查以避免 MATLAB 代码中出现 NaN?如果有人可以给我一个与之相关的想法的例子,那将非常有帮助。
【问题讨论】:
isnan吗?
您可以使用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
【讨论】:
有几个函数可以与 NaNs 一起使用:isnan、nanmean、max() 和 min() 还有一个 NaN 标志 ('omitnan'),无论您想在最小值还是最大值中包含 NaN评估。
尽管您必须注意:有时NaNs 也可以由您的代码生成(例如,0/0 或在执行标准化时(x-mean(x))/std(x) 如果x 包含1 个值或多个但相等的值)。
【讨论】:
您无法避免NaN,因为某些计算会产生它作为结果。例如,如果您计算1/0-1/0,您将得到NaN。你应该在代码级别处理NaNs,使用像isnan这样的内置函数。
【讨论】:
NaNs 无关——正则表达式对字符串进行操作,而NaN 不是字符串
几种情况会产生一个包含 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;
【讨论】:
简单:
A=[1 2; nan 4];
A(isnan(A))=0;
【讨论】: