有没有从矩阵中删除NaN的一般方法?

时间:2016-02-11 12:01:36

标签: matlab matrix nan

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

5 个答案:

答案 0 :(得分:5)

您可以使用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

答案 1 :(得分:2)

有几个与NaNs一起使用的功能:isnannanmeanmax()min()也有一个NaN标记('omitnan' )是否要在最小或最大评估中包含NaN。

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

答案 2 :(得分:1)

您无法避免NaN,因为某些计算会产生结果。例如,如果您计算1/0-1/0,则会获得NaN。您应该使用NaN等内置函数处理代码级别的isnan

答案 3 :(得分:1)

提出包含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;

答案 4 :(得分:0)

易:

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