是否有任何通用的方法从矩阵中删除NaN?有时我会在某些代码中遇到这个问题,然后它会产生问题以获得适当的输出。是否有任何方法可以生成任何类型的检查以避免在MATLAB代码中出现NaN?如果有人可以给我一个与之相关的一些想法,那将会非常有帮助。
答案 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
一起使用的功能:isnan
,nanmean
,max()
和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;