如何将一系列值求和,而忽略任何NaN值?

时间:2019-03-26 01:44:04

标签: matlab sum average nan

我使用MATLAB版本R2015a。

我几次解决了最优问题,都得到了一系列答案,我想求和并求平均值。但是,其中一些是NaN。如何编写代码以忽略那些NaN并求和其他不是NaN的代码?

3 个答案:

答案 0 :(得分:3)

选项1:使用基本MATLAB中的sumisnan的免费工具箱解决方案。

A = [1 2 3 4 5 6 7 8 9 NaN];
sum(A(~isnan(A)))               % No toolbox required

选项2: nansum(请参阅OP中的answer) 注意:nansum需要统计工具箱。

nansum(A)                       % Requires Statistics toolbox

使用MATLAB R2018b测试的代码。


评论更新
@ Cris Luengo对于具有较新版本的用户提出了很好的建议。不需要工具箱。

sum(A,'omitnan')                % No toolbox required

@ Ben Voigt的一些建议。也不需要工具箱。

sum(A(isfinite(A)))             % No toolbox required

答案 1 :(得分:2)

您可以使用以上答案中建议的内置函数。如果您想了解逻辑并使用循环,则可以如下所示:

A = [NaN 1 2 NaN 3 4 7 -1 NaN] ; 
count = 0 ;
thesum = 0 ; 
for i = 1:length(A)
    if ~isnan(A(i))
        count = count+1 ;
        thesum = thesum+A(i) ;
    end
end

答案 2 :(得分:1)

您可以使用omitnan参数

A = [1 2 3 4 5 6 7 8 9 NaN];
s = sum( A, 'omitnan' )

请注意,这实际上与R2006a之前引入的统计信息工具箱中的nansum函数所使用的代码相同,因此我认为兼容性非常好。