Matlab 如何添加两个矩阵并消除NAN
如何添加两个矩阵,并仅保留忽略NaN值的数字 例如:Matlab 如何添加两个矩阵并消除NAN,matlab,nan,Matlab,Nan,如何添加两个矩阵,并仅保留忽略NaN值的数字 例如: A=[NaN 2 NaN]; B=[1 NaN 3]; 我想要某种形式的plusC=A+B,这样: C=[1 2 3] 您可以使用(您需要统计和机器学习工具箱): 并获得: C = 1 2 3 或者,您可以与排除NaN标志一起使用: C = sum([A;B],'omitnan') 您将得到相同的结果。只需将NaNs设置为0s,然后执行求和,即可实现此目的,而无需使用任何特定的函数调用: A(A~=A)=0
A=[NaN 2 NaN];
B=[1 NaN 3];
我想要某种形式的plusC=A+B
,这样:
C=[1 2 3]
您可以使用(您需要统计和机器学习工具箱):
并获得:
C =
1 2 3
或者,您可以与排除NaN标志一起使用:
C = sum([A;B],'omitnan')
您将得到相同的结果。只需将
NaNs
设置为0s
,然后执行求和,即可实现此目的,而无需使用任何特定的函数调用:
A(A~=A)=0
B(B~=B)=0
C=A+B
编辑:如@rayryeng在第一条评论中所建议的,实现这一点的另一种方法是使用isnan
:
A(isnan(A))=0
B(isnan(B))=0
C=A+B
我建议使用
isnan
而不是A~=A
或B~=B
。不仅意图更加明确,而且某些CPU可能不会产生预期的答案。执行isnan
不会产生歧义。鉴于A~=A
和A(isnan(A))=0的工作原理相同,我认为第一个更巧妙,因为它不使用任何特定的函数调用。无论如何,我不知道CPU依赖性问题,并添加了您的建议作为对答案的编辑。谢谢你的帮助@havakok,请记住,这种方法的警告是,您需要修改原始变量,或者创建它们的另一个副本。如果它们很大,或者如果你有很多,这可能是一个限制,也可能只是一个负担。@EBH,我明白你的意思,但至少我们这样做不会丢失重要信息!尽管我找不到Matlab的sum
实现,但我认为他们在实现中使用isnan
来处理ommitnan
或includenan
开关,我认为这可能会造成与我们在答案中相同的开销。@hmofrad是的,你是正确的。在函数内部,它们只需将所有NaN值设置为0,并使用isnan
。另外,sum
是一个内部函数,它调用LAPACK-FORTRAN库的包装器,这就是您无法看到实际源代码的原因。顺便说一句,侦察得不错
A(isnan(A))=0
B(isnan(B))=0
C=A+B